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

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+)

输出:

发现值:此订单是为QT3000下的!好吗

找到值:此订单是为QT300下的

找到的值:0

找到值:!好吗


问题:我不明白为什么第二组没有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+