编辑:如果可能的话,我还需要让正则表达式与字符串格式匹配
[id='value1' or id='value2' or ... or id='valueN']
并捕获所有值。
我有一段代码没有按我的预期工作,我不确定我的错误在哪里。 基本上我有一个像
这样的字符串[id='id1' or id='id2' or id='id3']
并且我需要找到所有值,例如
id1
、id2
和 id3
。
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
这两种输出都不是预期的。有人可以指出我正则表达式是否错误或者是因为该小组找到了部分代码吗?
您可以使用正则表达式来匹配所有 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
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
?
这是因为量化表达式中的组仅报告最后一次捕获。
其他答案提供了解决方案。