【问题标题】:A match is found but how do I extract the data?找到匹配项,但如何提取数据?
【发布时间】:2010-08-09 23:35:32
【问题描述】:

我有以下正则表达式 (abc|def)( ?(\\d+|(?:(?!\\1)[a-z])+)?)* 与主题 abc123 456 完美匹配。
现在我想得到所有部分 abc123456

我使用以下代码:

Pattern p = Pattern.compile(pattern);
Matcher m = p.matcher(subject);

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

但我只得到abc123 456

欢迎提出任何想法。

【问题讨论】:

  • 虽然我没有分析整个模式,但这看起来过于复杂。特别是,在(abc|def|[a-z]+) 中,[a-z]+ 部分将匹配“abc”或“def”,因此将它们列为替代品没有区别。
  • 我忘记使用实际模式。 ;) 现在它是正确的。
  • 模式可能与输入匹配良好,但是否正确匹配组?
  • 是的,它可以工作,但我注意到我可以简化正则表达式。 abc|def 是命令,然后是由空格分隔的参数。我正在寻找一种方法来获得它们。但是我觉得截断命令,按空格分割比较容易,不是吗?

标签: java regex matcher


【解决方案1】:

您必须单独获取每个组,而不是 m.group()javadoc 声明 m.group() 等同于 m.group(0),并且可以使用 m.group(int) 版本访问各个组。因此,以下断言应该如您所愿地反映分组。

Assert.assertEquals("abc", m.group(1));
Assert.assertEquals("123", m.group(2));
Assert.assertEquals("456", m.group(3));

【讨论】:

  • 感谢您的建议。 m.group(1) 返回 abc,m.group(2) 什么都没有,m.group(3) 456。所以我没有得到我想要的。我想单独获得所有三个部分。
【解决方案2】:

我使用了上面评论中解释的解决方案:

是的,它有效,但我注意到我可以 简化正则表达式。 abc|def 是 命令,然后有 参数由空格分隔。和我 寻找获得它们的方法。但是我 认为更容易切断 命令并按空格分割,不是吗?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-02-18
    • 2020-12-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多