关于查找数字字符串的Java正则表达式

时间:2012-07-11 14:29:51

标签: regex

我正在网上学习Java正则表达式教程,并对一个小程序感到困惑。

  // String to be scanned to find the pattern.
  String line = "This order was places 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) );
  } 

打印出的结果是:

Found value: This order was places for QT3000! OK?

Found value: This order was places for QT300

Found value: 0

我不知道为什么小组(1)获得上述价值?为什么它在'QT3000'的最后一个零之前停止?

非常感谢!

2 个答案:

答案 0 :(得分:2)

第一组(.*)(这是索引1 - 索引0是整体正则表达式)是一个贪婪的匹配。它尽可能多地捕获,同时让整体表达仍然匹配。因此,字符串中的第二个0最多可能需要0才能匹配(\\d+)。如果你想要不同的行为,那么你应该阅读贪婪和非贪婪的比赛,或找到更合适的模式。

答案 1 :(得分:0)

实际上你的组号错了。

组0将始终是匹配的整个字符串

组1将是(。*)的匹配,称为“贪婪”,因为它将匹配尽可能多的字符(在您的情况下“此订单是QT300的位置”)

第2组是(\ d +)的匹配,这是匹配正则表达式的最小值(在你的情况下是“0”)

第3组(你没有打印)是最后一个(。*)并且应该匹配“!OK”(“?”是一个特殊的正则表达式字符,如果你想匹配它,那么它的前缀是\)< / p>

如果你想匹配第2组的3000,请使用此正则表达式:

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