我正在尝试使用正则表达式来抓取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));
}
}
答案 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