【问题标题】:Java - Reg expression using groupsJava - 使用组的正则表达式
【发布时间】:2009-06-25 21:43:48
【问题描述】:

我需要从一个字符串中提取与给定模式匹配的组。

示例字符串:<XmlLrvs>FIRST</XmlLrvs><XmlLrvs>SECOND</XmlLrvs><XmlLrvs>Third</XmlLrvs>

每个组应以<XmlLrvs> 开头并以</XmlLrvs> 结尾。这是我的代码的 sn-p...

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));
}

输出为&lt;XmlLrvs&gt;Third&lt;/XmlLrvs&gt;。我期待第一组和第二组,但没有被捕获。有人可以帮忙吗?

【问题讨论】:

    标签: java regex


    【解决方案1】:

    当您应该迭代匹配时,您正在迭代组。 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));
    }
    

    【讨论】:

    • 注意,正则表达式中的+需要去掉,否则所有内容都会一次匹配,而不是3次迭代。
    • 我不同意,.+?是一个非贪心量词。但我没有测试过。
    • 删除表达式尾部的 + 并使用建议的 while 控制语句就可以了。谢谢
    • @molf:没错,你没看到!
    【解决方案2】:

    试试看
    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

    【讨论】:

      猜你喜欢
      • 2012-01-23
      • 2015-12-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-09-28
      • 2013-01-18
      • 2012-01-16
      • 1970-01-01
      相关资源
      最近更新 更多