当我想要所有时,Java正则表达式只找到最后一个匹配

时间:2013-11-19 05:54:45

标签: java regex

我有这个

Pattern pattern = Pattern.compile(".*(MyFunc[(](?s).*[)];).*", Pattern.DOTALL | Pattern.MULTILINE);

我想匹配MyFunc的所有出现(ANYTHING);

while (matcher.find()) {
    System.out.println(matcher.group(1));
}

以上仅打印文本中的最后一个匹配

Binding(CTRL+O, MyFunc("test1\ndkjs");  ParameterizedCommand(C
MyFunc("test2"); dskj MyFunc("test3\n"); kdjskfjskjfksjf

期望的输出:

MyFunc("test1\ndkjs");
MyFunc("test2");
MyFunc("test3\n");

3 个答案:

答案 0 :(得分:2)

使用此正则表达式尝试完全相同的代码:

(MyFunc\\(.*?\\);)

答案 1 :(得分:2)

如果您想捕获MyFunc的所有“来电”,那么您需要的正则表达式是

(MyFunc[(](?s).*?[)];)

请参阅live demo at Regexr

同时考虑避免使用点星并将括号内的部分放入非右边的括号中,如下所示:

 (MyFunc[(][^)]*[)];)

Live demo for this alternative

另请注意,上面链接的regxr演示设置了全点和全局和多行标志;所以你可以匹配像

这样的东西
MyFunc(
   xyz
   );

您可以在放入代码时轻松地将这些标记添加到正则表达式中。请注意,如果您使用(?s)

,则无需使用内部[^)]*

Third and last live demo, showing line breaks within call

答案 2 :(得分:2)

如果你想找到

MyFunc("test1\ndkjs");
MyFunc("test2");
MyFunc("test3\n");

然后只需要在正则表达式的开头或结尾处.*。只需创建匹配MyFunc(的正则表达式,最后不是));的零个或多个字符。

MyFunc\\([^)]*\\);

这样的东西