2017-03-27 102 views
8

我想捕獲匹配輸入可以包含此組的一個或多個模式的組。正則表達式:捕獲一個或多個組(如果存在)(Java)

例子:

input = 12361 randomstuff371 12 Mar 16 138more random381 stuff73f 

我想捕捉的 「16年3月12日」。

從這個我很容易地使用正則表達式:

pattern = (".*(\\d{2}\\s\\w+\\s\\d{2}).*"); 

但是我的問題是,當輸入可以包含這些團體的不止一個,我不能夠捕捉到以後的比賽。

實施例:

input = randomstuff371 12 Mar 16 14 Jan 15 13 Feb 16 138more random381 stuff73f 

使得:

group 1 = 12 Mar 16 
group 2 = 14 Jan 15 
group 3 = 13 Feb 16 

以匹配將總是改變這些基團的數目,因此我不知道是否有一個正則表達式,將工作在輸入包含一個或多個這些組。我曾嘗試過:

pattern = (".*(\\d{2}\\s\\w+\\s\\d{2}\\s)+.*"); \\ Not sure about whitespace at the end 

但是它不起作用。這更多與我如何存儲這些捕獲的組有關?我不能預先確定我需要的組的數量,特別是因爲正則表達式需要處理許多這些輸入。

我感覺好像只是捕捉整個日期段並稍後用matcher.find()來處理它來計算我需要的組數。

任何幫助將不勝感激。

+0

這是因爲前後的'。*'。不要這樣做。 –

+0

@詹姆斯,請考慮接受答案,如果它適合你(請參閱[如何接受所​​有答案](http://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work) )。 –

回答

13

它會更容易只匹配你的特定圖案,並使用Matcher#find()獲得子所獲得的多個匹配:

String s = "randomstuff371 12 Mar 16 14 Jan 15 13 Feb 16 138more random381 stuff73f"; 
Pattern pattern = Pattern.compile("\\b\\d{2}\\s\\w+\\s\\d{2}\\b"); 
Matcher matcher = pattern.matcher(s); 
while (matcher.find()){ 
    System.out.println(matcher.group(0)); 
} 

online Java demoregex demo

我向模式添加了單詞邊界以確保模式匹配爲整個單詞,但是如果您的子字符串粘在另一個文本上,它們可能會被忽略。

相關問題