带有。* vs普通正则表达式的Java正则表达式组

时间:2013-04-14 08:08:21

标签: java regex regex-greedy

我正在尝试使用正则表达式来抓取2个完整的字符串。我在http://gskinner.com/RegExr/

上正常运行正则表达式

以下是一个示例字符串:

Regex is fun when it works 99

这是我的正则表达式

(.*)\\s+(\\d+)$

这些是我在使用Java的matcher(matches())和pattern:

时得到的组
1: Regex is fun when it works 99
2: Regex is fun when it works

使用普通正则表达式(在RegExr上),我得到了我实际期望的结果:

1: Regex is fun when it works
2: 99

将Regex放入Java需要注意的是否有任何注意事项?我已经有了\\特殊字符。也许有一个使用技巧。 ?

如果您想要复制和粘贴示例应用:

String str = "Regex is fun when it works 33";
String regx = "(.*)\\s+(\\d+)$"

Pattern p = Pattern.compile(regx);
Matcher m = p.matcher(str);

if (m.matches()) {
   for (int i = 0; i < m.groupCount(); i++) {
      System.out.println(i + ": " + m.group(i));
   }
}

2 个答案:

答案 0 :(得分:3)

将您的第一次捕获更改为非贪婪,如下所示:

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

请参阅this regex tutorial中的“注意贪婪”,但简单地说,尾随?使前面的*量词懒惰。也就是说,它会尽快停止使用角色。

答案 1 :(得分:3)

您未获得99预期的原因是group(0)中的整个匹配groupcount()未计算在内,因此for循环过早挽救

因此,如果您将i < m.groupCount()更改为i <= m.groupCount(),您将获得

  

0:当正常工作时,正则表达很有趣99   1:正则表达式很有趣   2:99