2

関数名がCコードのブロック内にあるかどうかを確認するための簡単な正規表現があります(実際の名前検索コードはJavaで記述されています)。この例では、私が見つけようとしている関数名はputFillerDataと呼ばれています。コードブロックは次のようになります。

static void fillerSwapByteOrder(int t_database, tag_t t_message, char* data_buff, int* pos)
{
short data_length = trxDBGetNodeSize(t_database);

if (!data_length) return;

char *data = umalloc(data_length);

if (data_length == sizeof(short))
{
    short s_data = 0;
    shareGReadData(t_database, &s_data);
    short nbo_data = htons(s_data);
    memcpy(data, &nbo_data, sizeof(short));
}
else if (data_length == sizeof(int))
{
    int s_data = 0;
    shareGReadData(t_database, &s_data);
    int nbo_data = htonl(s_data);
    memcpy(data, &nbo_data, sizeof(int));
}
else
{
    ufree(data);
    return;
}

putFillerData(t_message, data, data_length, data_buff, pos);

ufree(data);
}

私が使用している正規表現ステートメントは次のようになります。

Pattern.matches("\\b" + Pattern.quote(name) + "\\b", code);

ただし、これは常にfalseを返します...なぜですか?

私がこの正規表現を使用している理由は、.containsが部分文字列も検出するためですが、これは私が望んでいることではありません...

4

2 に答える 2

6

.matches()文字列全体が正規表現に一致する場合にのみTrueを返します。

.find()次の方法を使用します。

Pattern regex = Pattern.compile("\\b" + Pattern.quote(name) + "\\b");
Matcher regexMatcher = regex.matcher(subjectString);
foundMatch = regexMatcher.find();

また、\b英数字と英数字以外の文字の間でのみ一致します。したがって、がの場合は問題ありませんが、のような場合nameは問題putFillerDataありませんputFillerData()

于 2012-09-18T09:28:51.567 に答える
0

を使用find()して、これはここで適切になります。

Pattern pat = Pattern.compile("\\b" + Pattern.quote(name) + "\\b");
Matcher matcher = pat.matcher("Target_Source");

String s = new String();

while(matcher.find()){


   foundMatch = matcher.group(0);

}
于 2012-09-18T09:35:25.557 に答える