2013-09-06 6 views
-1

скобках следующие строки - матч:Perl Regex матч сбалансированные

"MNO(A=(B=C) D=(E=F)) PQR(X=(G=H) I=(J=(K=L)))" - "MNO" 
"MNO(A=(B=C) D=(E=F))" - "MNO" 
"MNO" - "MNO" 
"RAX.MNO(A=(B=C) D=(E=F)) PQR(X=(G=H) I=(J=(K=L)))" - "RAX.MNO" 
"RAX.MNO(A=(B=C) D=(E=F))" - "RAX.MNO" 
"RAX.MNO" - "RAX.MNO" 

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

Любые идеи? Не знаю, как проверить правильно близость ..

должны использовать Perl-регулярных выражений

+1

Вы уверены, что хотите сделать это с помощью регулярных выражений? Это будет рекурсивное регулярное выражение и, следовательно, его не лучший способ решить вопрос. Использование классического решения через стек намного проще. –

+2

Это возможно в некоторых вариантах регулярных выражений. Какой из них вы используете? –

+0

@ Мне нужно использовать Regex – RaphaelH

ответ

4

В Perl или PHP, например, вы можете использовать регулярные выражения, как

/\((?:[^()]++|(?R))*\)/ 

, чтобы соответствовать сбалансированные круглые скобки и их содержимое.

См. Его на regex101.

Чтобы удалить все эти матчи из строки $subject в Perl, вы можете использовать

$subject =~ s/\((?:[^()]++|(?R))*\)//g; 

Объяснение:

\(  # Match a (
(?:  # Start of non-capturing group: 
[^()]++ # Either match one or more characters except(), don't backtrack 
|  # or 
(?R) # Match the entire regex again, recursively 
)*  # Any number of times 
\)  # Match a) 
+0

@RaphaelH: Это регулярное выражение работает в Perl или PCRE (Perl-совместимые регулярные выражения). –

+0

Да, это работает, спасибо! – RaphaelH

+0

+1 Хороший. Это также упоминается в [perldoc perlre] (http://perldoc.perl.org/perlre.html#%28?_PARNO_%29-%28?-_PARNO_%29-%28?+_PARNO_%29-%28? R% 29-% 28? 0% 29). Было бы хорошо с более подробным объяснением. – TLP

Смежные вопросы