我想了解下面的Java正则表达式程序是如何工作的。我无法理解程序输出中的第二行
String line = "This order was placed for QT3000! OK?";
String pattern = "(.*)(\\d+)(.*)";
Pattern r = Pattern.compile(pattern);
// Now create matcher object.
Matcher m = r.matcher(line);
if (m.find( )) {
System.out.println("Found value: " + m.group(0) );
System.out.println("Found value: " + m.group(1) );
System.out.println("Found value: " + m.group(2) );
这会产生这样的输出
Found value: This order was placed for QT3000! OK?
Found value: This order was placed for QT300
Found value: 0
我理解我们在字符串中搜索的模式是一个数字(\d+
)的序列,其中包含(.*)
之前和(.*)
之后的任何内容。如果我在这里错了,请纠正我。
我知道m.group(0)返回整个字符串。我不明白输出的第二行。 找到的价值:此订单适用于QT300 。这里发生了什么?
答案 0 :(得分:4)
它返回从第一个捕获组( ... )
生成的匹配。由于默认情况下*
是greedy运算符,因此它匹配所有字符串中的最后一位数字。
打破它:
m.group(0) → Entire match → (.*)(\\d+)(.*) // This order was placed for QT3000! OK?
m.group(1) → Capture Group 1 → (.*) // This order was placed for QT300
m.group(2) → Capture Group 2 → (\\d+) // 0
m.group(3) → Capture Group 3 → (.*) // ! OK?
答案 1 :(得分:1)
这是因为正则表达式中的贪婪(尽可能多)和温顺(在需要时回馈)。 (Greedy... but Docile)
因此,它很好地解释了你到达那里的情况。
This order was placed for QT300
0
! OK?
要更好地理解如果将一个更改为无限制(\ d +)为零到无限制(\ d *),组1中的贪婪行为将全部采用。