Как разделить логическое выражение на операторы как разделители, сохранив при этом их в результате? - PullRequest
1 голос
/ 04 февраля 2020

Подобно этому вопросу Я хочу разделить свое логическое выражение A >= 10 AND B <= 20 OR C in ('3', '4') на A, >=, 10, AND, B, <=, 20, OR, C, in, ('3', '4')

как это можно сделать?

Я пытаюсь пойти по следующему пути (но это не выглядит элегантным подходом)

String orRules[] = inputRule.split(" OR ");
        for (int i = 0; i < orRules.length; i++) {
            String andRules[] = orRules[i].split(" AND ");
            for (int j = 0; j < andRules.length; j++) {

                String[] result = andRules[j].split("(?<=[-+*/])|(?=[-+*/])");
                System.out.println(Arrays.toString(result));

            }
            orRules[i] = String.join(" AND ", andRules);
        }
        output = String.join(" OR ", orRules);

1 Ответ

0 голосов
/ 04 февраля 2020

Необходимое регулярное выражение выглядит примерно так:

\(.*\)|[^\s]+

Вы можете найти пример здесь, на regex101.com с пояснениями.

В Java Вы должны соответствовать регулярному выражению и не делиться на него. С помощью окружающих скобок (\(.*\)|[^\s]+)+ вы создаете группы, которые можно найти, как в следующем примере:

import java.util.regex.Matcher;
import java.util.regex.Pattern;

...

 public static void main(String[] args) {
    String ex = "A >= 10 AND B <= 20 OR C in ('3', '4')";
    String regex ="(\\(.*\\)|[^\\s]+)+";
    Pattern p = Pattern.compile(regex);
    Matcher m = p.matcher(ex);
    while(m.find()) {
       System.out.println(m.group(1));
    }
 }
...