2

我在网上学习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

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

非常感谢你!

4

2 回答 2

2

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

于 2012-07-11T14:32:35.583 回答
0

实际上你弄错了组号。

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

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

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

第 3 组(您没有打印)是最后一个 (.*) 并且应该匹配“!OK”(“?”是一个特殊的正则表达式字符,如果你想匹配它,请在它前面加上 \)

如果要匹配组 2 上的 3000,请使用此正则表达式:

String pattern = "(.*?)(\\d+)(.*)";
于 2012-07-11T14:38:49.073 回答