Сопоставление вложенных скобок без рекурсии или балансирующих групп
Сопоставление вложенных скобок с использованием регулярных выражений может оказаться сложной задачей, особенно в таких языках, как Java, где рекурсия и балансирующие группы не поддерживаются. К счастью, это ограничение действительно можно обойти, используя прямые ссылки.
Сопоставление внешних групп
Следующее регулярное выражение [1] соответствует внешним группам скобки без наложения ограничений на глубину:
(?=\()(?:(?=.*?\((?!.*?\1)(.*\)(?!.*\2).*))(?=.*?\)(?!.*?\2)(.*)).) ?.*?(?=\1)[^(]*(?=\2$)
Здесь выражение ищет открывающиеся скобки, исключая несовпадающие открывающие скобки, и фиксирует соответствующие закрывающие скобки. Захваченные подстроки, хотя и бесполезны, служат заполнителями для завершения сопоставления.
Соответствие внутренним группам
Чтобы включить внутренние группы, мы можем записать следующее выражение [2]:
(?=\()(?=((?:(?=.*?\((?!.*?\2)(.*\)(?!.*\3).*))(?=.*?\)(?!.*?\3)(.*)).) ?.*?(?=\2)[^(]*(?=\3$)))
Добавив группу захвата и корректируя индексы обратных ссылок, это выражение также фиксирует внутренние группы.
Как это работает
Метод выполняет итерацию по строке, сопоставляя следующие открывающие и закрывающие круглые скобки, пока захватывая оставшуюся строку в каждом случае. Упреждающие просмотры обеспечивают сбалансированное совпадение круглых скобок.
Выражение строится следующим образом:
Компонент | Описание |
---|---|
(?=() | Утверждает, что '(' предшествует сложному анализу |
(?: | Начало группы без захвата для повторной обработки строк |
(?= | Утверждает, что следующий '(' следует за |
.?((?!.?\1) | Соответствие до следующего '(', за которым не следует группа 1 |
(.)(?!.\2).* | Заполните группу 1 строкой, убедившись, что существует еще одна ')' |
) | Подтвердить, что соответствие ')' допустимо |
.?)(?!.?\2) | Утвердить, что следующая ')', за которой не следует группа 2, существует |
(.*) | Заполните группу 2 оставшейся строкой |
) | Подтвердить, что совпадение ')' допустимо |
Потребляйте один символ, чтобы продолжить сопоставление внутри группа | |
) ? | Повторить группу (во внутреннем цикле) |
.*?(?=\ 1) | Соответствует последнему найденному '(' включительно |
1*(?=\2 $) | Сопоставление до последней ')' (но внутри допустимой группы) |
Этот метод позволяет эффективно сопоставлять вложенные скобки без необходимости для групп рекурсии или балансировки.
Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.
Copyright© 2022 湘ICP备2022001581号-3