сопоставить открывающую скобку с соответствующей закрывающей скобкой - PullRequest
2 голосов
/ 02 февраля 2012

Я использую Java для своей программы
предположим, у меня есть такая строка

xx(yyzz(iijj))qq((kkll)(gghh))

Есть ли способ сопоставить xx(yyzz(iijj)) и qq((kkll)(gghh)) отдельно, используя регулярное выражение?

Ответы [ 2 ]

7 голосов
/ 02 февраля 2012

Простой ответ - нет, нет способа сделать это, используя только регулярное выражение.Просто переберите строку и поместите открытые скобки в стек.Поп, когда вы нажмете закрытые скобки.Если вы попытаетесь выскочить или закончите, и стек не будет пустым, он станет недействительным.

Вы также можете сделать это рекурсивно, удалив первый индекс '(' и lastIndex of ')', убедившись, что индекс '(' меньше индекса ')'

4 голосов
/ 02 февраля 2012

Вы можете сопоставить вложенные скобки с помощью регулярных выражений до фиксированного уровня. Но более 2 уровня станут довольно грязными (2 уже есть, если честно). Это будет соответствовать вашим примерам:

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

Краткое объяснение:

\(              # match a '(' 
(               # open group 1
  [^()]*+       #   match any chars other than '(' and ')'
  |             #   OR
  \([^()]*+\)   #   match '(...)'
)*              # close group 1 and repeat it zero or more times
\)              # match a '(' 

См. Демонстрацию на ideone.com

Существуют разновидности регулярных выражений, которые могут соответствовать произвольному числу вложений (Perl, .NET, PHP), но Java не является одним из них.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...