2013-04-14 271 views
2

我想用正则表达式来抓取2个完整的字符串。我已经得到了正则表达式工作的罚款http://gskinner.com/RegExr/Java正则表达式组与。* vs正常正则表达式

下面是一个简单的字符串:

Regex is fun when it works 99 

这里是我的正则表达式

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

这些群体使用Java的匹配,当我得到(匹配())和模式:

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 

正在那里正则表达式的时候,我需要知道什么注意事项到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

示例代码+1。 – MikeM

回答

3

你没有得到你想要的99的原因是整个比赛group(0)不包括在groupcount()之内,所以for循环太早退出。

因此,如果你改变i < m.groupCount()i <= m.groupCount()你会得到

0:正则表达式是乐趣,当它工作99
1:正则表达式是乐趣,当它工作
2:99

+0

嗨,迈克, 啊,它一直躲在那里。我觉得自己像个白痴!必须生锈。 谢谢你指出了修复:) – Jdcc

+0

+1 crikey!我也错过了。尼斯接起来。 – Sepster

3

改变你的第一次捕捉是非贪婪的,如下:

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

请参阅“当心Greedyness”在this regex tutorial,但简单地说,尾随?使得前*量词懒惰。也就是说,它会尽早停止使用角色。

+0

嘿Sepster, 感谢您的快速答案和更有效的正则表达式! 这个懒惰的正则表达式更适合我期望捕获的东西。它也似乎会有更好的表现,但这只是一个假设:) 结合这与MikeM的答案,我已经解决了这个问题! 谢谢! – Jdcc