Использование регулярных выражений в Java - как вы можете захватить два набора внешних скобок, когда они содержат вложенные скобки и строковые литералы?

77
9

У меня возникают проблемы с моим регулярным выражением, чтобы зафиксировать правильные наборы скобок. В моем методе у меня есть:

Pattern pattern = Pattern.compile("\\s*union\\s+(\\(.+\\)|\\S+)\\s+and\\s+(\\(.+\\)|\\S+)\\s*;\\s*", Pattern.CASE_INSENSITIVE);
Matcher matcher = pattern.matcher(input);

if(matcher.matches())
{
group1 = matcher.group(1);
group2 = matcher.group(2);
}


Я хочу зафиксировать либо слово, либо содержимое внутри внешней скобки. В простых случаях это работает правильно (т.е. Если вход представляет собой union a or b; или union (union a and b) and c; или даже union (intersect table1 and table2) and (minus table4 and (union table1 and table2));)

Но если вход:

union (union a and b) and (union (union a and c) and d);

Я получил:

group1 = union a and b) and (union (union a and c
group2 = table1)

Но я хочу, чтобы group1 и group2 были:

group1 = union a and b
group2 = union (union a and c) and d



В подобных вводах он, похоже, захватывает последние "и". Другой пример:

input = union (union a and b) and (union (union c and d) and (union e and f));
group1 = (union a and b) and (union (union c and d)
group2 = (union e and f))


Как можно зафиксировать правильный набор скобок?

спросил(а) 2021-01-25T17:08:46+03:00 4 месяца, 4 недели назад
1
Решение
125

Вы не можете разобрать сканер. Вам нужен парсер. Регулярные выражения не могут обрабатывать вложенные круглые скобки. Это неправильная технология для этой задачи.

ответил(а) 2021-01-25T17:08:46+03:00 4 месяца, 4 недели назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема