【发布时间】:2018-04-24 05:17:32
【问题描述】:
我正在调用一个我无法更改的 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 各一行,包括 04 到 09。到目前为止,我还没有成功。我尝试过的一些方法不起作用:
- "(thing[0-9]+)" - 这匹配所有 12 个东西,这不是我想要的。
- "^(?:good|better): (thing[0-9]+)" - 仅匹配事物 4 和 7。
- "^(?:(?:good|better): .*)(thing[0-9]+)" - 仅匹配事物 6 和 9。
- "(?:(?:^good:|^better:|,) *)(thing[0-9]+)" - 匹配除 1 和 10 之外的所有内容。
还有更多,不胜枚举。我尝试了各种后视,但无济于事。
我想要的是所有匹配“thing[0-9]+”的字符串,但只有那些以“good:”或“better:”开头的行。
或者,更笼统地说,我希望多行模式中的多个匹配项,但只能来自具有特定前缀的行。
【问题讨论】:
-
(^(?:good|better): *thing\d{2}.*)regex101.com/r/8EbDRA/1 -
这只会匹配第一组,而不是所有的行
-
他说他想要多个匹配,这就是那个模式的作用。您可以通过与
((?:^(?:good|better): *thing\d{2}.*\n)+)987654325@ 非常相似的内容在一场比赛中获得所有内容
标签: java regex regex-lookarounds regex-group multiple-matches