Получение самых внешних разделителей в регулярных выражениях
Есть ли способ использовать регулярные выражения, чтобы получить текст между крайними разделителями? У меня есть строка здесь и хочу получить текст между крайним {%%%
а также %%%}
разделители:
Hello {%%%=Select(DepartmentID,1,{%%%=if(Gender="M","Mr.","Ms.")%%%}%%%} {%LastName%}
Текст, который я хочу получить:
=Select(DepartmentID,1,{%%%=if(Gender="M","Mr.","Ms.")%%%}
Что бы регулярное выражение для этого? Я знаю, что текст внутри не имеет особого смысла, это всего лишь пример.
4 ответа
Этот шаблон будет выглядеть позитивно:
[^%=]*.{%%%(.+)%%%}.+[^%}]*
группа захвата:
$1
пример: http://regex101.com/r/eG4fV9
РЕДАКТИРОВАТЬ: Кажется, некоторые люди любят приходить после того, как ответ был выбран как correct
затем добавление возможных сценариев, где это не сработает. Это нормально, однако, в зависимости от обстоятельств, в которых что-то используется, может сделать что-нибудь incorrect
,
оригинальный ответ:
(?<={%%%=).+(?=}%%%)[^%]
необязательный:
[^%=]*.{%%%=(.+)%%%}.+[^%}]*
Это сохранит =
войдите в спички.
Крис, вот два варианта, которые соответствуют тому, что вы ищете, используя рекурсивное регулярное выражение:
Опция 1:
\{((?:[^{}]++|(?R))*)\}
Вариант 2:
\{(([^{}]*+)(?:(?R)(?2))*)\}
Это синтаксис PCRE, который работает, например, в PHP.
Какой язык и движок регулярных выражений вы используете? Эти шаблоны могут быть адаптированы к нескольким другим разновидностям, которые поддерживают рекурсию.
В общем, если вы не можете найти какую-то уникальную особенность для разделителей (например, как заметил Евгений Рик в комментариях - это хорошее конкретное решение, если он только изменил его на нежадный), стандартные регулярные выражения не могут этого сделать.
Некоторые движки регулярных выражений, такие как Oniguruma Руби, могут, используя рекурсивные регулярные выражения. Что-то вроде (от макушки головы):
/{(?<braced>[^{}]*(?:{\g<braced>}[^{}]*)?)}/