2

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

这是一个示例字符串:

Regex is fun when it works 99

这是我的正则表达式

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

这些是我在使用 Java 的匹配器 (matches()) 和模式时得到的组:

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));
   }
}
4

2 回答 2

3

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

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

请参阅此正则表达式教程中的“注意贪婪” ,但简单地说,尾随?会使前面的*量词变得懒惰。也就是说,它将尽早停止消费字符。

于 2013-04-14T08:13:05.510 回答
3

你没有得到99你期望的原因是整个比赛group(0)没有被计算在内groupcount(),所以for循环太早了。

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

0:正则表达式在起作用时很有趣 99
1:正则表达式在起作用时很有趣
2:99

于 2013-04-14T09:16:50.480 回答