我正在网上学习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'的最后一个零之前停止?
非常感谢!
答案 0 :(得分:2)
第一组(.*)
(这是索引1 - 索引0是整体正则表达式)是一个贪婪的匹配。它尽可能多地捕获,同时让整体表达仍然匹配。因此,字符串中的第二个0
最多可能需要0
才能匹配(\\d+)
。如果你想要不同的行为,那么你应该阅读贪婪和非贪婪的比赛,或找到更合适的模式。
答案 1 :(得分:0)
实际上你的组号错了。
组0将始终是匹配的整个字符串
组1将是(。*)的匹配,称为“贪婪”,因为它将匹配尽可能多的字符(在您的情况下“此订单是QT300的位置”)
第2组是(\ d +)的匹配,这是匹配正则表达式的最小值(在你的情况下是“0”)
第3组(你没有打印)是最后一个(。*)并且应该匹配“!OK”(“?”是一个特殊的正则表达式字符,如果你想匹配它,那么它的前缀是\)< / p>
如果你想匹配第2组的3000,请使用此正则表达式:
String pattern = "(.*?)(\\d+)(.*)";