我正在调用一个我无法更改的API。也就是说,我不能将它作为两个连续的正则表达式或类似的东西。 API是这样编写的(当然是简化的):
void apiMethod(final String regex) {
final String input =
"bad: thing01, thing02, thing03 \n" +
"good: thing04, thing05, thing06 \n" +
"better: thing07, thing08, thing09 \n" +
"worse: thing10, thing11, thing12 \n";
final Pattern pattern = Pattern.compile(regex, Pattern.MULTILINE);
final Matcher matcher = pattern.matcher(input);
while (matcher.find()) {
System.out.println(matcher.group(1));
}
}
我调用了这样的东西:
apiMethod("(thing[0-9]+)");
我希望看到打印出六行,每行04到09,包括一行。到目前为止我还没有成功。我试过的一些东西不起作用:
还有更多,无法列出。我尝试了各种各样的后视,但无济于事。
我想要的是所有匹配“thing [0-9] +”的字符串,但只包含那些以“good:”或“better:”开头的行。
或者,更一般地说,我希望多行模式中的多个匹配,但只能来自具有特定前缀的行。
答案 0 :(得分:5)
您必须使用基于\G
的模式(在多线模式下):
(?:\G(?!^),|^(?:good|better):)\s*(thing[0-9]+)
\G
锚点强制匹配是连续的,因为它匹配上次成功匹配后的位置。
如果行很短,你也可以使用有限的可变长度lookbehind:
(?<=^(?:good|better):.{0,1000})(thing[0-9]+)