2015-11-02 40 views
0

我有模式編制這樣的:模式只找到一個正則表達式的字符

Pattern pattern = Pattern.compile(".*((M+)\\W*(d+)).*"); 

和字符串:

String string = "EEEE, MMMM d, yyyy"; 

matcher.group(2)僅返回 「M」,但我想得到整個「MMMM」一詞。我如何使用組來做到這一點?我認爲M +正則表達式將處理這種情況。在此先感謝;)

回答

1

您需要將第一個.*設置爲非貪婪,方法是在*旁邊添加?。注意.*是貪婪的,它匹配所有到最後的字符。因此.*(M+)應該只捕獲最後的M,因爲M之前存在的所有字符都與.*匹配。

Pattern pattern = Pattern.compile(".*?((M+)\\W*(d+)).*"); 
+0

呵呵,謝謝! – KarpatQ

+0

歡迎來到StackOverflow。我建議你閱讀[this](http://stackoverflow.com/help/accepted-answer)。 –

+0

@KarpatQ - Upvoting是說*感謝的最好方式,而不用實際說出來。 – TheLostMind

1

另一種方法是在您的正則表達式儘可能具體。如果你不想「吃起來」,在年初M,你應該指定:

Pattern pattern = Pattern.compile("[^M]*((M+)\\W*(d+)).*"); 

編輯:據Jeffrey E.F. Friedl in his book "Mastering Regular Expressions"(第7章,節「的非貪婪的結構與一個否定的字符類「),在大多數情況下,否定字符類應優先於非貪婪操作符。這是本書(我的舊版本)印刷版本第227頁上的最後一段的引用。

非貪婪構造毫無疑問是最強大的Perl5 補充正則表達式的味道,但你必須小心使用它們。 A 非貪婪.*?幾乎從來不是[^...]* 的合理替代品 - 對某一特定情況可能適用,但由於它們的含義截然不同,另一個可能不正確。