如何仅在某些行上获得多个 Java 正则表达式匹配项
How can I get multiple Java regex matches on only certain lines
有一个 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]+)" - 这匹配所有 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:" 开头的行。
或者,更笼统地说,我想要来自多行模式的多个匹配项,但仅来自具有特定前缀的行。
您必须使用基于 \G
的模式(在多行模式下):
(?:\G(?!^),|^(?:good|better):)\s*(thing[0-9]+)
\G
锚力匹配是连续的,因为它匹配上次成功匹配后的位置。
如果行很短,您也可以使用有限的可变长度回顾来做到这一点:
(?<=^(?:good|better):.{0,1000})(thing[0-9]+)
有一个 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]+)" - 这匹配所有 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:" 开头的行。
或者,更笼统地说,我想要来自多行模式的多个匹配项,但仅来自具有特定前缀的行。
您必须使用基于 \G
的模式(在多行模式下):
(?:\G(?!^),|^(?:good|better):)\s*(thing[0-9]+)
\G
锚力匹配是连续的,因为它匹配上次成功匹配后的位置。
如果行很短,您也可以使用有限的可变长度回顾来做到这一点:
(?<=^(?:good|better):.{0,1000})(thing[0-9]+)