如何在正则表达式重复中获得每个组匹配

时间:2015-05-11 22:52:09

标签: java regex

有没有办法获得重复内部给定组的所有匹配(使用Java的内置正则表达式API)?如果是这样,怎么样?

以下是一个示例(live code):

Pattern pattern = Pattern.compile("IF N = '([^']*)'( OR N = '([^']*)')* THEN");
String script = "IF N = 'abc' OR N = 'def' OR N = 'ghi' THEN";
Matcher matcher = pattern.matcher(script);

for( int i = 1; i <= matcher.groupCount(); i++){
    System.out.println(i + ": " + matcher.group(i));
}

我如何获得第3组的所有个人匹配(第二个=符号右侧的部分)?现在,上面的循环只返回第二个匹配(“ghi”)。

如果无法做到这一点,欢迎提出其他方法的建议,但我正在寻找最简单的方法。我的一般用例是匹配上面的代码片段,这些代码片段属于一组类别。我已经有正则表达式来匹配每个类别,但不是一个简单的方法来提取所有与组匹配的重要信息。

1 个答案:

答案 0 :(得分:0)

我能够通过在重复周围使用捕获组并使用第二个较小的正则表达式重新解析完整匹配重复来实现此目的。

String script = "IF N = 'abc' OR N = 'def' OR N = 'ghi' THEN";

// Groups:
// 1 = comparison value
// 2 = "or" list
//    1 = "or" comparison value
Pattern pattern = Pattern.compile("IF N = '([^']*)'(( OR N = '([^']*)')*) THEN");
Matcher matcher = pattern.matcher(script);
System.out.println("matches: "+ matcher.matches());
System.out.println("if "+matcher.group(1));

// just the "OR ..." parts
String orList = matcher.group(2);
Pattern innerPattern = Pattern.compile(" OR N = '([^']*)'");
Matcher innerMatcher = innerPattern.matcher(orList);
while(innerMatcher.find()){
    System.out.println("  or "+innerMatcher.group(1));
}

收率:

matches: true
if abc
  or def
  or ghi