正则表达式双拆分

regex double split

如果我想找到两个匹配项,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

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

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 并抓取 trim 第 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)),它匹配除 | 之外的一个或多个 (+) 字符(使用 [^|] 否定字符 class).

使用模式捕获两个值更简单。这是使用的 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*)(不完美,我没有尝试做一些有效的事情)