2013-11-25 21 views
0

我想寫一個像%etd(msg01)字符串的正則表達式。%etd(msg01)正則表達式?

String string = "My name is %etd(msg01) and %etd(msg02)"; 
Pattern pattern = Pattern.compile("%etd(.+)"); 
Matcher matcher = pattern.matcher(string); 

while(matcher.find()) { 
    System.out.println(matcher.group()); 
} 

它打印%etd(msg01) and %etd(msg02)。但是,我希望它分別打印%etd(msg01)%etd(msg02)。我的意思是我在尋找非貪婪的比賽。

在這種情況下,應如何改變正則表達式以使其不貪婪?

+0

如果你知道你正在尋找一個非貪婪的比賽,你爲什麼不寫使用一個正則表達式? –

+0

@ user1661951你試過解決方案嗎? – anubhava

回答

2

你應該使用這個表達式:

Pattern pattern = Pattern.compile("%etd\\([^)]+\\)"); 
+0

'\\(。*?\\)'可以用較少的併發症工作。 –

+1

@MarkoTopolnik:你提出了這個建議,我有點驚異。正則表達式中的IMO否定被認爲比使用'。*?'更好,更有效率。'??? – anubhava

+0

我幾乎不相信效率的差異在這裏會變得明顯,簡單本身就是一個特性。在有意義的地方應用最佳實踐。 –

1

請後放置一個問號*或+,使其nongreedy。這應該爲你工作...

Pattern pattern = Pattern.compile("%etd\\(.+?\\)");

雙斜線外,還需要打開和關閉括號的前面,因爲他們攜帶正則表達式中具有特殊意義。

如果您確定自己的名字在第一個名字後面沒有開放式名詞,那麼使用的另一種方法如下。

Pattern pattern = Pattern.compile("%etd\\([^(]+\\)");