我有模式編制這樣的:模式只找到一個正則表達式的字符
Pattern pattern = Pattern.compile(".*((M+)\\W*(d+)).*");
和字符串:
String string = "EEEE, MMMM d, yyyy";
matcher.group(2)僅返回 「M」,但我想得到整個「MMMM」一詞。我如何使用組來做到這一點?我認爲M +正則表達式將處理這種情況。在此先感謝;)
我有模式編制這樣的:模式只找到一個正則表達式的字符
Pattern pattern = Pattern.compile(".*((M+)\\W*(d+)).*");
和字符串:
String string = "EEEE, MMMM d, yyyy";
matcher.group(2)僅返回 「M」,但我想得到整個「MMMM」一詞。我如何使用組來做到這一點?我認爲M +正則表達式將處理這種情況。在此先感謝;)
您需要將第一個.*
設置爲非貪婪,方法是在*
旁邊添加?
。注意.*
是貪婪的,它匹配所有到最後的字符。因此.*(M+)
應該只捕獲最後的M
,因爲M
之前存在的所有字符都與.*
匹配。
Pattern pattern = Pattern.compile(".*?((M+)\\W*(d+)).*");
另一種方法是在您的正則表達式儘可能具體。如果你不想「吃起來」,在年初M
,你應該指定:
Pattern pattern = Pattern.compile("[^M]*((M+)\\W*(d+)).*");
編輯:據Jeffrey E.F. Friedl in his book "Mastering Regular Expressions"(第7章,節「的非貪婪的結構與一個否定的字符類「),在大多數情況下,否定字符類應優先於非貪婪操作符。這是本書(我的舊版本)印刷版本第227頁上的最後一段的引用。
非貪婪構造毫無疑問是最強大的Perl5 補充正則表達式的味道,但你必須小心使用它們。 A 非貪婪
.*?
幾乎從來不是[^...]*
的合理替代品 - 對某一特定情況可能適用,但由於它們的含義截然不同,另一個可能不正確。
呵呵,謝謝! – KarpatQ
歡迎來到StackOverflow。我建議你閱讀[this](http://stackoverflow.com/help/accepted-answer)。 –
@KarpatQ - Upvoting是說*感謝的最好方式,而不用實際說出來。 – TheLostMind