【问题标题】:regex double split正则表达式双拆分
【发布时间】:2018-04-11 11:06:34
【问题描述】:

如果我想找到两个匹配项,Java 正则表达式应该是什么样子

1. NEW D City 
2. 1259669

来自

Object No: NEW D City | Item ID: 1259669

我试过了

(?<=:\s)\w+

但它只会得到

 1. NEW
 2. 1259669

https://regex101.com/r/j5jwK2/1

【问题讨论】:

  • 您的实际输入数据是什么样的?它是不是像你展示的那样由成对的线条组成?
  • (?&lt;=:\s)\w+(\s+\w+)*?但也许一个适当的“解析器”在| 上拆分,然后用:(和修剪)映射会更好。
  • 尝试s.split("\\s*\\|?\\s*[^:|]+:\\s*"),但更合适的做法是匹配:\s*([^:|]+)并修剪.group(1)
  • 您可以使用:(?&lt;=:\s)[^|]+(?=\s|\z)
  • 我不确定正则表达式是否是正确的工具。

标签: java regex regex-negation regex-lookarounds regex-group


【解决方案1】:

使用模式来捕获这两个值更简单。这是使用的regex

Object No:([^|]*)\| Item ID: (\d*)

还有一个由 regex101 生成的代码,并适应了你想要的输出。

    final String regex = "Object No: ([^|]*)\\| Item ID: (\\d*)";
    final String string = "Object No: NEW D City | Item ID: 1259669";

    final Pattern pattern = Pattern.compile(regex);
    final Matcher matcher = pattern.matcher(string);

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

输出:

1: NEW D City 
2: 1259669

一个类似但更通用的解决方案是[^:]*[:\s]*([^|]*)\|[^:]*[:\s]*(\d*)(不完美,我没有尝试做一些有效的事情)

【讨论】:

    【解决方案2】:

    您可以使用两个拆分的组合:

    String key = "Object No: NEW D City | Item ID: 1259669";
    String[] parts = key.split("\\s*\\|\\s*");
    List<String> result = new ArrayList<>();
    for (String part : parts) {
        String[] kvp = part.split(":\\s*");
        if (kvp.length == 2) {
            result.add(kvp[1]);
            System.out.println(kvp[1]); // demo
        }
    }
    

    Java demo

    首先,您使用\\s*\\|\\s*| 包含 0+ 个空格)进行拆分,然后使用 :\\s*,冒号后跟 0+ 个空格。

    另一种方法是使用 :\s*([^|]+) pattern 并抓取和修剪 Group 1 值:

    String s = "Object No: NEW D City | Item ID: 1259669";
    List<String> result = new ArrayList<>();
    Pattern p = Pattern.compile(":\\s*([^|]+)");
    Matcher m = p.matcher(s);
    while(m.find()) {
        result.add(m.group(1).trim());
        System.out.println(m.group(1).trim()); // For demo
    }
    

    请参阅Java demo。在这个正则表达式中,([^|]+) 是一个捕获组(将其内容推送到matcher.group(1)),它匹配除| 之外的一个或多个(+)字符(使用[^|] 否定字符类)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-11-05
      • 2013-08-11
      • 2021-12-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多