Java - 使用分组的正则表达式

4
从一个字符串中,我需要提取出与给定模式匹配的组。
一个示例字符串:<XmlLrvs>FIRST</XmlLrvs><XmlLrvs>SECOND</XmlLrvs><XmlLrvs>Third</XmlLrvs> 每个组都应该以<XmlLrvs>开头,以</XmlLrvs>结尾。这是我的代码片段...
String patternStr = "(<XmlLrvs>.+?</XmlLrvs>)+";

// Compile and use regular expression
Pattern pattern = Pattern.compile(patternStr);
Matcher matcher = pattern.matcher(text);
matcher.matches();

// Get all groups for this match
for (int i = 1; i<=matcher.groupCount(); i++) {
   System.out.println(matcher.group(i));
}

输出是 <XmlLrvs>Third</XmlLrvs>。我期望的是第一组和第二组,但它们没有被捕获。有人能帮忙吗?
2个回答

8
你正在遍历组,但应该遍历匹配项。 matches() 方法检查整个输入是否匹配。你需要的是find()方法。

更改为:

matcher.matches();

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

为了

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

请注意,正则表达式中的 + 必须被移除,否则所有内容将一次性匹配,而不是分三次迭代匹配。 - molf
1
我不同意,.+?是一个非贪婪量词。但我还没有测试过。 - waxwing
1
将表达式末尾的“+”删除,并使用建议的while控制语句,就可以完成任务了。谢谢。 - Ken P
@molf:没错,我没看到那个! - waxwing

0

尝试一下
String patternStr = "<XmlLrvs>(.*?)</XmlLrvs>";
String text = "<XmlLrvs>FIRST</XmlLrvs><XmlLrvs>SECOND</XmlLrvs><XmlLrvs>Third</XmlLrvs>";
Pattern pattern = Pattern.compile(patternStr);

Matcher matcher = pattern.matcher(text);

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

输出结果为FIRST,SECOND,Third


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接