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

时间:2018-08-25 20:56:56

标签: java regex design-patterns

我有很多字符串,例如:

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

我需要获取bookx2cost。 还有pencasebala

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

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

我不需要'='之后的值;我需要在'='之前输入名称。

2 个答案:

答案 0 :(得分:3)

您可以使用

\w+(?=\s*=)

请参见regex demo

详细信息

  • \w+-1个或多个字母,数字或_(要仅匹配字母和数字,请使用\p{Alnum}
  • (?=\s*=)-后面跟着0+空格,然后是=字符(因为(?=...)是一个正向超前字符,需要其模式立即与当前位置的右边匹配)。

请参见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]

答案 1 :(得分:1)

您仅需使用一行代码即可捕获它们:

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

此拆分的正则表达式不是匹配列名称,而是匹配列名称之间的


测试代码:

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]
相关问题