Java 为什么字符串中的最后一个数字与正则表达式组不匹配?
输出: 发现值:此订单是为QT3000下的!好吗 找到值:此订单是为QT300下的 找到的值:0 找到值:!好吗Java 为什么字符串中的最后一个数字与正则表达式组不匹配?,java,regex,Java,Regex,输出: 发现值:此订单是为QT3000下的!好吗 找到值:此订单是为QT300下的 找到的值:0 找到值:!好吗 问题:我不明白为什么第二组没有300人,只有0人 这是因为\d+之前的贪婪*在回溯一个位置之前匹配尽可能多的字符,以允许匹配\d+,这意味着在第二组中捕获单个数字 此外,您不需要3组来捕获数字。只需使用这个正则表达式: String line = "This order was placed for QT3000! OK?"; String pattern = "(.*)(\\d+)
问题:我不明白为什么第二组没有300人,只有0人 这是因为
\d+
之前的贪婪<代码>*在回溯一个位置之前匹配尽可能多的字符,以允许匹配\d+
,这意味着在第二组中捕获单个数字
此外,您不需要3组来捕获数字。只需使用这个正则表达式:
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");
}
捕捉一个数字
代码:
\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");
}
这是因为
\d+
之前的贪婪*
<代码>*在回溯一个位置之前匹配尽可能多的字符,以允许匹配\d+
,这意味着在第二组中捕获单个数字
此外,您不需要3组来捕获数字。只需使用这个正则表达式:
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");
}
捕捉一个数字
代码:
\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");
}
因为
*
是贪婪的。这意味着它将尽可能地匹配
因此,第一组首先匹配整个字符串,但是\\d+
无法匹配行尾。因此正则表达式引擎回溯并尝试少匹配一个字符。它一直这样做直到
该订单是为QT300下的
匹配,然后\\d+
匹配接下来的“0”。最后,最后一组匹配到字符串的末尾
如果只想提取数字,请使用
\\d+
,因为*
是贪婪的。这意味着它将尽可能地匹配
因此,第一组首先匹配整个字符串,但是\\d+
无法匹配行尾。因此正则表达式引擎回溯并尝试少匹配一个字符。它一直这样做直到
该订单是为QT300下的
匹配,然后\\d+
匹配接下来的“0”。最后,最后一组匹配到字符串的末尾
如果只想提取数字,请使用\\d+