2014-09-12 3 views
0

Предположим, текст выглядит следующим образом:Как написать шаблон регулярного выражения, не вложен в другой шаблон

some text \({{my}} \) more text \(some\) text {{my}} more text 
some text {{my}} more text some text {{my}} more text 

Текст содержит два специальных моделей: {{...}} и \(...\) и {{...}} шаблон может быть вложен в \(...\) шаблон в тексте.

Моя задача - написать регулярное выражение (в php, так что механизм PCRE), который будет соответствовать всем шаблонам {{..}}, которые не вложены внутри шаблона \(...\). Итак, для примера выше, регулярное выражение должно возвращать только 3 {{...}} шаблонов, потому что первое вложено в \(...\).

Ну, шаблон, чтобы найти все {{...}} является /\{\{(?P<options>.*?)\}\}/g и у меня есть regex101 скрипку для него здесь: http://regex101.com/r/cQ1tQ4/1

Можно ли создать шаблон, как я описал выше?

ответ

0

Самый простой подход заключается в соответствии outer whatever outer | (inner) и взять захваченную группу:

\\(.+?\\)|{{(.+?)}} 

http://regex101.com/r/fX6sX8/3

0

Вы можете сделать это через PCRE глаголы (*SKIP)(*F),

\\\([^{}]*\{\{[^}]*\}\}[^\\]*\\\)(*SKIP)(*F)|\{\{(?P<options>[^}]*)\}\} 

DEMO

+0

или '\ {\ {(? P [^}] *) \} \} (?! [^ \\] * \\\)) 'http://regex101.com/r/cQ1tQ4/4 –

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