«Если рабочий хочет хорошо выполнять свою работу, он должен сначала заточить свои инструменты» — Конфуций, «Аналитики Конфуция. Лу Лингун»
титульная страница > программирование > Могут ли вложенные скобки сопоставляться без рекурсии или балансирующих групп?

Могут ли вложенные скобки сопоставляться без рекурсии или балансирующих групп?

Опубликовано 6 ноября 2024 г.
Просматривать:418

Can Nested Brackets Be Matched Without Recursion or Balancing Groups?

Сопоставление вложенных скобок без рекурсии или балансирующих групп

Сопоставление вложенных скобок с использованием регулярных выражений может оказаться сложной задачей, особенно в таких языках, как Java, где рекурсия и балансирующие группы не поддерживаются. К счастью, это ограничение действительно можно обойти, используя прямые ссылки.

Сопоставление внешних групп

Следующее регулярное выражение [1] соответствует внешним группам скобки без наложения ограничений на глубину:

(?=\()(?:(?=.*?\((?!.*?\1)(.*\)(?!.*\2).*))(?=.*?\)(?!.*?\2)(.*)).) ?.*?(?=\1)[^(]*(?=\2$)

Здесь выражение ищет открывающиеся скобки, исключая несовпадающие открывающие скобки, и фиксирует соответствующие закрывающие скобки. Захваченные подстроки, хотя и бесполезны, служат заполнителями для завершения сопоставления.

Соответствие внутренним группам

Чтобы включить внутренние группы, мы можем записать следующее выражение [2]:

(?=\()(?=((?:(?=.*?\((?!.*?\2)(.*\)(?!.*\3).*))(?=.*?\)(?!.*?\3)(.*)).) ?.*?(?=\2)[^(]*(?=\3$))) 

Добавив группу захвата и корректируя индексы обратных ссылок, это выражение также фиксирует внутренние группы.

Как это работает

Метод выполняет итерацию по строке, сопоставляя следующие открывающие и закрывающие круглые скобки, пока захватывая оставшуюся строку в каждом случае. Упреждающие просмотры обеспечивают сбалансированное совпадение круглых скобок.

Выражение строится следующим образом:

КомпонентОписание
(?=()Утверждает, что '(' предшествует сложному анализу
(?: Начало группы без захвата для повторной обработки строк
(?=Утверждает, что следующий '(' следует за
.?((?!.?\1)Соответствие до следующего '(', за которым не следует группа 1
(.)(?!.\2).*Заполните группу 1 строкой, убедившись, что существует еще одна ')'
)Подтвердить, что соответствие ')' допустимо
.?)(?!.?\2)Утвердить, что следующая ')', за которой не следует группа 2, существует
(.*)Заполните группу 2 оставшейся строкой
)Подтвердить, что совпадение ')' допустимо
Потребляйте один символ, чтобы продолжить сопоставление внутри группа
) ?Повторить группу (во внутреннем цикле)
.*?(?=\ 1)Соответствует последнему найденному '(' включительно
1*(?=\2 $)Сопоставление до последней ')' (но внутри допустимой группы)

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


  1. (
Заявление о выпуске Эта статья перепечатана по адресу: 1729740015. В случае каких-либо нарушений, пожалуйста, свяжитесь с [email protected], чтобы удалить ее.
Последний учебник Более>

Изучайте китайский

Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.

Copyright© 2022 湘ICP备2022001581号-3