15

我想设置一个模式,该模式将找到一个受“边界”第一次出现限制的捕获组。但是现在使用了最后一个边界。

例如:

String text = "this should match from A to the first B and not 2nd B, got that?";
Pattern ptrn = Pattern.compile("\\b(A.*B)\\b");
Matcher mtchr = ptrn.matcher(text);
while(mtchr.find()) {
    String match = mtchr.group();
    System.out.println("Match = <" + match + ">");
}

印刷:

"Match = <A to the first B and not 2nd B>"

我希望它打印:

"Match = <A to the first B>"

我需要在模式中更改什么?

4

4 回答 4

45

使您的* 非贪婪/不情愿使用*?

Pattern ptrn = Pattern.compile("\\b(A.*?B)\\b");

默认情况下,该模式会表现得很贪婪,并匹配尽可能多的字符以满足该模式,即直到最后一个B

请参阅文档中的Reluctant Quantifiers本教程

于 2012-10-11T21:14:38.777 回答
6

不要使用贪婪的表达式进行匹配,即:

Pattern ptrn = Pattern.compile("\\b(A.*?B)\\b");
于 2012-10-11T21:14:03.537 回答
4

*是匹配尽可能多的字符以满足模式的贪婪量词。直到B您的示例中的最后一次出现。这就是为什么你需要使用不情愿的一个:*?,这将尽可能少的字符。所以,你的模式应该稍微改变一下:

Pattern ptrn = Pattern.compile("\\b(A.*?B)\\b");

请参阅文档本教程中的“不情愿量词” 。

于 2012-10-11T22:01:47.247 回答
1

也许比不情愿/懒惰更明确的*是说你正在寻找 A,然后是一堆不是 B的东西,然后是 B:

Pattern ptrn = Pattern.compile("\\b(A[^B]*B)\\b");
于 2012-10-11T21:16:14.773 回答