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。
答案 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+
。