Java正则表达式中多次出现组

时间:2014-06-14 05:25:01

标签: java regex

我在下面的输入字符串中查找重复组。

目标:

一行必须有4个或更多[Key:value]对出现。(带矩形括号)

输入:

<2014/06/14-11:03:06.695>+Timer-11+INFO@TimeLogger.logTime: [Process Name : Nav Calculations] [Total Time : 7 ms][Wait Time : 0 ms][Execution Time : 7 ms].

段:

final Pattern p = Pattern.compile("(\\[.*?\\]){4,}");
final Matcher m = p.matcher(s);
while (m.find()) {
  System.out.println(m.group());
}

使用上面的代码片段,匹配器无法找到匹配项。

但如果我将模式更改为"(\\[.*?\\]){3}")",则返回以下值。

[Process Name : Nav Calculations] [Total Time : 7 ms][Wait Time : 0 ms][Execution Time : 7 ms]

我还查看了之前关于正则表达式的其他帖子。但无法理解我在这里缺少什么。

为什么正则表达式"(\\[.*?\\]){4,}"不起作用。我应该在这个正则表达式中改变什么才能达到我的目标

请从这里引导我。

1 个答案:

答案 0 :(得分:2)

第一个找不到匹配,因为组之间有空格。

你有空位:

[Process Name : Nav Calculations] [Total Time : 7 ms][Wait Time : 0 ms][Execution Time : 7 ms]
                                 ^ space

因此,您无法一个接一个地匹配四组大括号。空间需要匹配。

修复正则表达式

另一方面,如果量化组中有可选空格,则可以匹配它:

(?:\[.*?\]\s*){4} // This works!

为什么(?:\[.*?\]){3}匹配四个群组?

  1. 允许点星跳过空间。
  2. 第一个实例与[Process Name : Nav Calculations] [Total Time : 7 ms]
  3. 相匹配
  4. 第二场比赛[Wait Time : 0 ms]
  5. 第三场比赛[Wait Time : 0 ms][Execution Time : 7 ms]
  6. <强>参考

    以下文章可能会消除任何遗留问题。

    The Many Degrees of Regex Greed