我正在调用一个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:"开头的行。
更一般地说,我想从多行模式中获取多个匹配项,但仅限于具有特定前缀的行。
((?:^(?:good|better): *thing\d{2}.*\n)+)
一次性获取所有内容。 - CAustin