2015-09-01 3 views
4

Я хочу захватить согласованные фигурные скобки.Regex: захват парных фигурных скобок

Например:

Some example text with \added[author]{text with curly braces{some text}..}

Some example text with \added[author]{text without curly braces}

Some example text with \added[author]{text with {}and {} and {}curly braces{some text}..}

Some example text with \added[author]{text with {}and {} and {}curly braces{some text}..} and extented text with curly braces {}

Ожидаемые результаты:

Some example text with text with curly braces{some text}..

Some example text with text without curly braces

Some example text with text with {}and {} and {}curly braces{some text}..

Some example text with text with {}and {} and {}curly braces{some text}.. and extented text with curly braces {}

т.е. я хочу, чтобы захватить текст между \added[]{ и } (его относительная закрывающие фигурные скобки) .Problem с моей регулярное выражение, Я не знаю, как захватить связанные фигурные скобки.

Я попытался,

 "/\\\\added\\[.*?\\]{(.[^{]*?)}/s" 

Я знаю, что он игнорирует, если { присутствует в тексте. Но я не понимаю, как создать регулярное выражение, чтобы получить согласованные фигурные фигурные скобки.

+0

Пожалуйста, ребята, помогите мне с моим вопросом по адресу http://stackoverflow.com/questions/33841196/how-to-match-text-inside-starting-and-closing-curly-brace-the-tags-and-the -спец –

ответ

2

Чтобы соответствовать паре скобок вы хотите использовать recursive subpattern.


Пример:

$regex = <<<'REGEX' 
/
\\added\[.*?\]    # Initial \added[author] 

(       # Group to be recursed on. 
    {       # Opening brace. 

    (      # Group for use in replacement. 

     ((?>[^{}]+)|(?1))* # Any number of substrings which can be either: 
           # - a sequence of non-braces, or 
           # - a recursive match on the first capturing group. 
    ) 

    }       # Closing brace. 
) 
/xs 
REGEX; 

$strings = [ 
    'Some example text with \added[author]{text with curly braces{some text}..}', 
    'Some example text with \added[author]{text without curly braces}', 
    'Some example text with \added[author]{text with {}and {} and {}curly braces{some text}..}', 
    'Some example text with \added[author]{text with {}and {} and {}curly braces{some text}..} and extented text with curly braces {}' 
]; 

foreach ($strings as $string) { 
    echo preg_replace($regex, '$2', $string), "\n"; 
} 

Выход:

Some example text with text with curly braces{some text}.. 
Some example text with text without curly braces 
Some example text with text with {}and {} and {}curly braces{some text}.. 
Some example text with text with {}and {} and {}curly braces{some text}.. and extented text with curly braces {} 
+0

Отлично! Огромное спасибо. Не могли бы вы объяснить это регулярное выражение? – Learning

0

Используйте этот regex

/\\added[^]]*]{([^}]*}[^}]*)}/s 

Demo here

+0

Спасибо! Он работает только для примера, который я дал ... но целью регулярного выражения является получение согласованных фигурных скобок. Пожалуйста, обратитесь к моему обновленному сообщению для получения дополнительных примеров. – Learning

1

использовать следующее регулярное выражение:

\\\\added\\[[^\\]]\*][^\\{]\*{((?:(?:[^\\{\\}]\*\\{[^\\}\\{]\*\\})\*||[^\\}]\*)\*)} 
+0

Что делать, если 'Some example text with \ added [author] {текст с {} и {} и {} фигурные скобки {некоторый текст} ..} и протяженный текст с фигурными фигурными скобками {}'? В этом случае вывод должен выглядеть следующим образом: «Пример текста примера с текстом с {} и {} и {} фигурными фигурными скобками {некоторый текст} .. и протяженный текст с фигурными фигурными скобками {}' Проблема в том, что она захватывает до последнего фигурного брекеты, он не захватывает до согласованных фигурных скобок – Learning

+0

Теперь он работает. Спасибо – Learning

2

Здесь должен работать

/\\added\[.*\]\{(.*(?:.*\{.*\}.*)*)\}/gU 

Объяснение

/\\added\ является Latex тег,

\[.*\] вариант из латекса тега,

\{ открывающая скобка,

(.*(?:.*\{.*\}.*)*) захватывается текст, который здесь мы также предотвратить рекурсивного {...} или несколько {...} внутри нашей целевой метки,

\} закрыть кронштейн.

Стратегия

Я не считаю пару кронштейна рекурсивной формы

{ { {...} } } 
c b a a b c 

, где мы имеем пару a, b и c,

, но я считаю их, как это!

{ { {...} } } 
a b c a b c 

см: DEMO

Последние два примера в моем демо также доказать, что он работает правильно.

ВАЖНО: модификатор U предположим, будет использоваться здесь для целей, не жадного квантора иначе мое регулярное выражение не будет работать правильно.

+1

Он работает! Спасибо. Должен ли я знать, какое регулярное выражение будет эффективным способом с рекурсией или без нее? – Learning

+0

Мое регулярное выражение не требует даже 'lookaround', простого шаблона. Надеюсь, вам это понравится! – fronthem

+1

Я собираюсь использовать простой шаблон регулярного выражения – Learning

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