Как разбить строку (на основе множества разделителей), но без пробелов? - PullRequest
2 голосов
/ 05 августа 2020

У меня есть Java строк, которые являются логическими выражениями со скобками, &, | и ! в качестве операторов, и я хочу разбить их на токены. Например:

((!A1)&(B2|C3)) должно стать "(","(","!","A1",")","&","(","B2","|","C3",")",")"

После этого ответа Я обнаружил, что могу использовать Java s String.split() с регулярным выражением, которое включает предложения lookahead и lookbehind:

List<String> tokens = "((!A1)&(B2|C3))".split("((?<=[!&()|])|(?=[!&()|]))")

Моя единственная проблема состоит в том, что в список токенов будут включены пробелы. Например, если бы я записал выражение как ( ( !A1 ) & ( B2 | C3 ) ), тогда мой split() произвел бы по крайней мере четыре строки, такие как " ", и вокруг моих переменных было бы отступ (например, " A1 ").

Как я могу изменить это выражение split и регулярное выражение, чтобы токенизировать строку, но не сохранять пробелы?

1 Ответ

1 голос
/ 05 августа 2020

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

[!&()]|[^!&()\h]+

RegEx Demo

Детали RegEx:

  • [!&()]: совпадение ! или & или ( или )
  • |: OR
  • [^!&()\h]+: Сопоставьте любые символы, НЕ !, &, (, ) и пробел

Код:

final String regex = "[!&()]|[^!&()\\h]+";
final String string = "((!A1)&( B2 | C3 ))";

final Pattern pattern = Pattern.compile(regex);
final Matcher matcher = pattern.matcher(string);

List<String> result = new ArrayList<>();
while (matcher.find()) {
    result.add(matcher.group(0));
}

System.out.println(result);
...