Java 正则表达式匹配器未给出预期结果。号码不匹配

Java 正则表达式匹配器未给出预期结果。号码不匹配,java,regex,Java,Regex,我不明白为什么第二组只给我0。我预计3000英镑。并给我指出一个我能更好理解的资源 import java.util.regex.Matcher; import java.util.regex.Pattern; public class RegexMatches { public static void main( String args[] ) { // String to be scanned to find the pattern. String line

我不明白为什么第二组只给我0。我预计3000英镑。并给我指出一个我能更好理解的资源

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class RegexMatches {

   public static void main( String args[] ) {
      // String to be scanned to find the pattern.
      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
模式之前添加
QT
,或使用
*?
而不是第一个
*
以获得尽可能少的字符

String pattern = "(.*QT)(\\d+)(.*)";

行。见a

(.*QT)(\\d+)(.*)
将尽可能多地匹配并捕获第1组中除换行符以外的任何0+字符,直到最后出现的
QT
(后面是后续子模式),然后将匹配并捕获第2组中的1+个数字,然后将匹配并捕获第3组中的其余行

备选模式中的
*?
将匹配并捕获第1组中除换行符以外的任何0+字符,尽可能少,直到第一个1位数或更多位数的块


您也可以使用更简单的模式,如
String pattern=“QT(\\d+)
获取
QT
之后的所有数字,结果将在第1组中(数字前后没有文本)。

量词将尝试匹配尽可能多的数字,因为它是
贪婪的
量词。 通过将其更改为
*?

然后,您的正则表达式将变成:

(.*?)(\d+)(.*)
您将在第二组中匹配
3000


这里是

您需要使第一个
*
量词非贪婪。将其更改为
*?
感谢Wiktor的支持。如果字符串是“ABCD1234DEFG”,而我只想提取1234,该怎么办。
string pattern=“\\d+”
如果要使用
模式#find()
。或者只是
s=s.replaceAll(“\\D+”,”),请参阅。感谢Seblor的回答。“?”在这个正则表达式中实际上是做什么的?据我所知,它用于匹配0或1个事件。我想知道这个正则表达式的意义是什么。我使
*
量词不贪婪(懒惰)。它对
+
量词也同样有效。非贪婪(懒惰)是什么意思?与其尝试尽可能多地匹配,il将在正则表达式的其余部分能够匹配时立即停止匹配。
(.*?)(\d+)(.*)