代码之家  ›  专栏  ›  技术社区  ›  dian mushkov

正则表达式双重拆分

  •  -1
  • dian mushkov  · 技术社区  · 6 年前

    如果我想找到两个匹配项,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 回复  |  直到 6 年前
        1
  •  1
  •   AxelH    6 年前

    使用模式捕获这两个值更简单。这是 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
  •  1
  •   Wiktor Stribiżew    6 年前

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

    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* (a) | 用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) )匹配一个或多个( + )除 | (带有 [^|] 取反的字符类)。