1

cflowの出力を解析しようとしています。これは、制御フローの3Dグラフを作成するために使用されます。cflowの出力は次のようになります。

main() <int main (int argc, char *argv[]) at sort.c:3>:
    strcmp()
    printf()
    malloc()
    getline() <char *getline (int max) at sort.c:62>:
        isspace()
        getchar()
        ungetc()
        malloc()
    qsort()
    free()

main()正規表現を使用して関数名と括弧を抽出しています- 、、などを取得したいですstrcmp()。私のコードは次のとおりです。

String line = input.nextLine(); // input is a Scanner reading from a file
Pattern p = Pattern.compile("[a-zA-Z0-9_]+\\(\\)"); // the important part
Matcher m = p.matcher(line);

現在、私が使用しているパターンは、Emacsの正規表現ビルダーモードを使用して機能します。しかし、このプログラムを実行すると、一致するものがありません。私はおそらくJavaの正規表現関数を理解していないだけです。

また、明らかな解決策はJavaを使用しないことだと思います...私はそれを好みますが、Processingを使用してグラフを描画するので、実際には選択肢がありません。

4

2 に答える 2

1

文字列の一部を抽出しようとしている場合は、括弧を使用して正規表現でグループを形成する必要があります。正規表現を次のように書き直した場合.*([a-zA-Z0-9_]+\\(\\)).*、リテラル括弧内のグループは実際には一致として保存されます。次に、 を呼び出しm.group(1)て、最初の括弧で囲まれたグループによって抽出された文字列を取得します[a-zA-Z0-9_]+\\(\\)

于 2012-04-25T18:08:08.147 に答える
0

現在の構文 and を使用するとm.matches()、Java は次のことを意味すると想定します。

Pattern p = Pattern.compile("^[a-zA-Z0-9_]+\\(\\)$");

そのため、式の最初と最後にワイルドカードを追加する必要があります (一致させたい部分を括弧で囲みました)。

Pattern p = Pattern.compile(".*([a-zA-Z0-9_]+\\(\\)).*");

またはm.find()の代わりに呼び出しますm.matches()

次のように呼び出すことができます。

if(m.matches())
{
    myFunctionName = m.group(1);
}
于 2012-04-25T18:19:50.050 に答える