Как захватить повторяющийся узор с условием? - PullRequest
0 голосов
/ 25 августа 2018

У меня много строк, например ::100100

  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 ]

0 голосов
/ 26 августа 2018

Вы можете захватить их всех, используя только одну строку кода:

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]
0 голосов
/ 26 августа 2018

Вы можете использовать

\w+(?=\s*=)

См. Демоверсию regex

Подробности

  • \w+- 1 или более букв, цифр или _ (для сопоставления только букв и цифр используйте \p{Alnum})
  • (?=\s*=) - за которыми следуют 0+ пробелов и затем символ = (как(?=...) - это позитивный прогноз, который требует, чтобы его шаблон совпадал справа от текущего местоположения.

См. Java-демонстрацию :

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]
...