2013-04-14 268 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