为什么字符串中的最后一位数字与正则表达式组不匹配?

时间:2017-09-17 06:33:40

标签: java regex

String line = "This order was placed for QT3000! OK?";
String pattern = "(.*)(\\d+)(.*)";

// Create a Pattern object
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) );
    System.out.println("Found value: " + m.group(3) );

}else {
    System.out.println("NO MATCH");
}

输出:

找到价值:此订单是为QT3000下达的! OK?

找到值:此订单是针对QT300

发现值:0

发现价值:! OK?

问题:我不明白为什么第2组没有300而只有0。

2 个答案:

答案 0 :(得分:0)

这是因为.*之前的贪心 \d+.*匹配尽可能多的字符,然后仅回溯一个位置以允许匹配\d+,这意味着在第二组中捕获单个数字。

此外,您不需要3组来捕获号码。只需使用此正则表达式:

\d+

捕获一个数字。

<强>代码:

String line = "This order was placed for QT3000! OK?";
String pattern = "\\d+";

// Create a Pattern object
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) );
}else {
    System.out.println("NO MATCH");
}

输出

Found value: 3000

答案 1 :(得分:0)

因为.*贪婪。这意味着它会尽可能多地匹配。

所以第一组首先匹配整个字符串,但是\\d+无法匹配行尾。因此正则表达式引擎回溯并尝试减少一个字符。它一直这样做,直到

  

此订单已针对QT300

匹配,然后\\d+匹配下一个“0”。最后,最后一组匹配字符串的结尾。

如果您只想提取数字,请使用\\d+