查找全局模式匹配

时间:2015-09-16 20:46:31

标签: java regex

我有这样的模式:

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());     
}

2 个答案:

答案 0 :(得分:4)

这是用if替换while的情况。只要匹配器没有重置,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());     
}

答案 1 :(得分:0)

它没有重复或循环的原因是因为你没有使用while语句。要使其正常工作,请将if语句更改为while。

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

对您的正则表达式模式使用此修改:

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

更改\\s?的原因是即使没有空格也可以匹配模式。希望这有帮助!