2014-10-11 41 views
1

编辑:我想也需要,如果可能的话,有正则表达式匹配字符串格式Java的匹配组捕捉

[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 

既不输出所预期的。有人可以指出,如果正则表达式是错误的,或者是因为该组找到部分代码?

回答

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 
+0

嗨,谢谢你的回复。它可以像你提到的那样工作,但是正则表达式的限制性不足以匹配模式。其他字符串,如“[id ='id1'和id ='id2'和id ='id3']”将匹配正则表达式。有没有办法让验证和捕获都只有一个正则表达式?谢谢 – user4132657 2014-10-11 19:56:37

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从结果中缺失?

这是因为量化表达式中的组只报告上次捕获。

其他答案提供解决方案。