Найти соответствующие скобки, используя регулярное выражение

Предполагая, что у меня есть эта string: "abc{def{ghi{jkl}mno{pqr}st}uvw}xyz"

и я хочу "{def{ghi{jkl}mno{pqr}st}uvw}" это: "{def{ghi{jkl}mno{pqr}st}uvw}"

каково должно быть мое регулярное выражение …?

Другими словами, совпадение должно начинаться с «{» и заканчиваться на «}», но между ними должно быть столько {'s как}.

Думаю, я нашел ответ в другой теме.

 "#\{((?>[^\{\}]+)|(?R))*\}#x" 

Я тестировал его с помощью разных строк и, похоже, выполнял эту работу.

Любые комментарии о том, как это работает.? За и против..?

Спасибо за ответы btw .. 🙂

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

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

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

Я бы разработал сценарий, который начинается с любого конца, отмечая положение символа каждого открытого и закрывающего скобок, а затем назначая их вместе, чтобы получить «подходящую пару». Это, конечно, немного сложнее, но, надеюсь, вы понимаете, что я получаю.

 #!/usr/bin/perl use strict; use warnings; my $str = "abc{def{ghi{jkl}mno{pqr}st}uvw}xyz" ; $str =~ /[^{]*({.*})/ ; print $1 ; 

и результат:

 {def{ghi{jkl}mno{pqr}st}uvw} 

удовлетворить ваши потребности? Я не знаком с php, но думаю, вы все равно можете использовать одно и то же регулярное выражение.

Ваше выражение может быть:

 \{.*\} 

'*' жадный, поэтому он получит все, начиная с первой скобки, пока не найдет последнюю скобку