正则表达式双拆分

时间:2018-04-11 11:06:35

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

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

2 个答案:

答案 0 :(得分: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并抓取并修剪第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)),与+以外的一个或多个(|)字符匹配([^|] 1}}否定的字符类)。

答案 1 :(得分: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*)(不完美,我没有尝试做一些有效的事情)