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 的 regexp-builder 模式。然而,当我运行这个程序时,我没有得到任何匹配。我可能只是不了解 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 回答