2015-09-16 100 views
2

我有這樣一個規律:查找全球模式匹配

String pattern = "(media:\\s\\d+)" 

我想匹配的

"media:" + space/no space + X 

...其中X是一組數字的字符串變化。該模式可以出現在任何文字的任何地方,然後是任何東

這裏的例子:

「影響文本的時刻:相機捕捉致命的爆炸和 混亂馬拉松的終點線附近媒體:18962980視頻顯示 亞軍...下降爲爆炸的結果媒體:18967421旁觀者 拍攝了位於兩次爆炸之間的人們的混亂。「

爲此,我的模式只返回第一次出現而不是全部。 這裏是我使用的代碼:

String pattern = "(media:\\s\\d+)"; 
Pattern media = Pattern.compile(pattern,Pattern.MULTILINE); 
java.util.regex.Matcher m = media.matcher(text);   
if(m.find()) { 
    logger.info("-- group:"+m.group());  
} 
+1

'String pattern =「(media:\\ s?\\ d +)」'? – Tunaki

+1

請顯示代碼。或許,只需用'while'替換'if'?除非您分割字符串,否則圍繞整個模式的捕獲組是多餘的。 –

回答

1

這是一個while更換if的情況。只要匹配器未被重置,Matcher#find將繼續匹配令牌,直到它耗盡字符串。

您還需要調整正則表達式,因爲您可能會或可能不會匹配空格。使用表達式\\s?,它可以與單個空間匹配或不匹配。

作爲一般提示,Pattern.MULTILINE只有錨(^$)有意義,並且由於您沒有任何,您可以安全地刪除它。它沒有像現在這樣造成任何損害,但它會主動讓你的代碼變得不可讀。

String pattern = "media:\\s?\\d+"; 
Pattern media = Pattern.compile(pattern); 
java.util.regex.Matcher m = media.matcher(text);   
while(m.find()) { 
    logger.info("-- group:"+m.group());  
} 
+0

哦拍!我明白你的意思了!謝謝! – user2917629

+0

很好的評論彙編。 :)雖然我會用'\ s'使用不同的量詞。 –

+0

您不需要'Pattern.MULTILINE',模式中沒有'^'和'$'。 –

0

它沒有重複或循環的原因是因爲您沒有使用while語句。爲了工作,將你的if語句改爲while。

while(m.find()) { 
    logger.info("-- group:"+m.group());  
} 

使用此修改您的正則表達式:

String pattern = "(media:\\s?\\d+)" 

原因即\\s?的變化,使您即使沒有空間有匹配的模式。希望這可以幫助!

+0

'[\\ s +]?'也可以匹配'+'符號。 –

+0

hmmmmmn。從來沒有聽說過。 –

+0

在這裏,[看看這個演示](https://regex101.com/r/mF4mW4/1)和學習[字符類](http://www.regular-expressions.info/charclass.html)。 –