【问题标题】:java parse regex multiple capture groupsjava解析正则表达式多个捕获组
【发布时间】:2018-04-16 01:29:09
【问题描述】:

您好,我需要能够处理这两种情况

约翰,4 人聚会
威廉,六人聚会不喜欢约翰,杰夫

我想要捕捉的是

  • 从字符串 1:约翰,4
  • 来自字符串 2:william, 6, john, jeff

我很困惑如何实现这一目标

我知道([^,])+ 给了我第一组(只是逗号前的名称,不包括逗号),但我不知道如何连接表达式的其他部分。

【问题讨论】:

  • 试试这个正则表达式 (?:(?:^| )(?:[^A-Za-z, ])?([^, ]+))+ 这是用于获取名称跨度>
  • 您介意拆分字符串还是引用它们?我不知道哪个是字符串 1,哪个是字符串 2。
  • 欢迎来到 SO @Joe,请阅读:stackoverflow.com/help/how-to-ask 。一个简单的改进是在代码块周围加上反引号` `
  • 谢谢大家!抱歉格式化@jkinkead
  • 感谢@PedroLobito

标签: java regex regex-group


【解决方案1】:

你可以使用

(\w+)(?:,\s*party of (\d+)|(?![^,]))

请参阅regex demo

详情

  • (\w+) - 第 1 组:一个或多个单词字符
  • (?:,\s*party of (\d+)|(?![^,])) - 非捕获组匹配
    • ,\s*party of (\d+) - ,,然后是 0+ 个空格,然后是 party of 和一个空格,然后第 2 组捕获 1+ 个数字
    • | - 或
    • (?![^,]) - 后跟 , 或字符串结尾的位置。

See Java demo:

String regex = "(\\w+)(?:,\\s*party of (\\d+)|(?![^,]))";
List<String> strings = Arrays.asList("John, party of 4", "william, party of 6 dislikes John, jeff");

Pattern pattern = Pattern.compile(regex);
for (String s : strings) {
    System.out.println("-------- Testing '" + s + "':");
    Matcher matcher = pattern.matcher(s);
    while (matcher.find()) {
        System.out.println(matcher.group(1) + ": " + (matcher.group(2) != null ? matcher.group(2) : "N/A"));
    }
}

输出:

-------- Testing 'John, party of 4':
John: 4
-------- Testing 'william, party of 6 dislikes John, jeff':
william: 6
John: N/A
jeff: N/A

【讨论】:

    猜你喜欢
    • 2013-07-31
    • 1970-01-01
    • 1970-01-01
    • 2014-08-17
    • 1970-01-01
    • 2020-01-02
    • 1970-01-01
    • 1970-01-01
    • 2013-05-07
    相关资源
    最近更新 更多