代码之家  ›  专栏  ›  技术社区  ›  Ali Bagheri

如何捕获具有条件的重复模式?

  •  2
  • Ali Bagheri  · 技术社区  · 7 年前

    我有很多字符串,例如:

    1. "book = 12 AND x2 = 50 AND cost = 45"
    2. "pen = 1 AND case = 10 AND bala = 40"
    3. ...

    我需要得到 book , x2 , cost . 和 pen , case , bala

    我用这个,但它不起作用:

    (?:(.*?)(?==))+
    

    我不需要“=”后的值;我需要“=”前的名称。

    2 回复  |  直到 7 年前
        1
  •  3
  •   Wiktor Stribiżew    7 年前

    你可以用

    \w+(?=\s*=)
    

    查看 regex demo

    细节

    • \w+ -1个或多个字母、数字或 _ (要仅匹配字母和数字,请使用 \p{Alnum} )
    • (?=\s*=) -后面是0+空格,然后是 = 字符(as (?=...) 是一个积极的前瞻,要求其模式立即与当前位置的右侧匹配)。

    查看 Java demo :

    String s = "book = 12 AND x2 = 50";
    Pattern pattern = Pattern.compile("\\w+(?=\\s*=)");
    Matcher matcher = pattern.matcher(s);
    List<String> res = new ArrayList<>();
    while (matcher.find()){
        res.add(matcher.group(0)); 
    } 
    System.out.println(res); 
    // => [book, x2]
    
        2
  •  1
  •   Bohemian    7 年前

    您只需使用一行代码就可以捕获它们:

    String [] cols = str.split("\\s*=.*?(?=$|\\w+\\s*=)");
    

    此拆分regex不匹配列名,而是匹配 之间 列名称。


    测试代码:

    String str = "book = 12 AND x2 = 50 AND cost = 45";
    String[] cols = str.split("\\s*=.*?(?=$|\\w+\\s*=)");
    System.out.println(Arrays.toString(cols));
    

    输出:

    [book, x2, cost]