Java匹配组捕获

时间:2014-10-11 17:07:37

标签: java regex matcher regex-group

编辑:如果可能的话,我还需要让正则表达式匹配字符串格式

[id='value1' or id='value2' or ... or id='valueN'] 

并捕获所有值。

我有一段代码无法按照我的预期运作,我不确定我的错误在哪里。 基本上我有一个像

这样的字符串
[id='id1' or id='id2' or id='id3'] 

我需要找到所有值,例如id1id2id3

final String regex = "\\[id='([^']+)'(?:\\s*or\\s*id='([^']+)')*\\]";
final String text = "[id='id1' or id='id2' or id='id3']";
final Pattern pattern = Pattern.compile(regex);
final Matcher matcher = pattern.matcher(text);

如果我这样做

while(matcher.find())
{
   System.out.println(matcher.group(1));
}

我只得到

id1

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

我得到了

id1
id3

预期输出

id1
id2
id3

两种输出都不是预期的输出。如果正则表达式错误或是因为小组找到了代码的一部分,有人可以指点我吗?

3 个答案:

答案 0 :(得分:0)

id='([^']*)'

这应该使用g标志。抓住捕获。参见演示。

http://regex101.com/r/vR4fY4/12

答案 1 :(得分:0)

您可以使用正则表达式匹配所有ID值。

String s = "[id='id1' or id='id2' or id='id3']";
Pattern regex = Pattern.compile("(?<=id=')[^']+");
Matcher matcher = regex.matcher(s);
while(matcher.find()){
        System.out.println(matcher.group(0));
}

输出:

id1
id2
id3

答案 2 :(得分:0)

Matcher#find()个州的javadoc

  

尝试查找与模式匹配的输入序列的下一个子序列。

如果模式包含多个捕获的组,您将能够在相同的find()次迭代中检索它们。

所以你可以这样做

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

,它会为您提供与Matcher#matches()尝试相同的结果。

现在,为什么结果中缺少id2

这是因为量化表达式中的组仅报告最后一次捕获。

其他答案提供了解决方案。