正则表达式匹配器未给出预期结果。没有正确匹配数字

时间:2017-08-21 12:01:29

标签: 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 = "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");
      }
   }
}

2 个答案:

答案 0 :(得分:2)

精确模式,在QT模式之前添加\d,或使用.*?代替第一个.*来获取尽可能少的字符。

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

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

会做的。请参阅Java demo

(.*QT)(\\d+)(.*)将匹配并捕获除了换行符之外的任何0 +字符的第1组,尽可能多,直到最后一次出现QT(后跟子模式),然后将匹配并捕获1+个数字到组2中,然后匹配并捕获到组3中的其余部分。

替代模式中的.*?将匹配除了换行符之外的任何0+字符捕获到第1组,尽可能,直到第一个或更多的第一个块位数。

您也可以使用更简单的模式String pattern = "QT(\\d+)";来获取QT之后的所有数字,结果将在第1组中(您将不会在数字之前和之后获得文本)

答案 1 :(得分:1)

*量词会尝试尽可能多地匹配 ,因为它是greedy量词。 您可以将其更改为*?

,使其变得非贪婪(懒惰)

然后,你的正则表达式将成为:

(.*?)(\d+)(.*)

您将匹配第二个捕获组中的3000

这是a regex101 demo