2015-07-07 2 views
0

мне нужноNEGATE и повторить атомную группу в JavaScript регулярное выражение

  • матча {{
  • группа начала захвата
  • ничего то не }}
  • конец захвата
  • матч }}

образца:

dummy text 
{{ text to be matched }} 
more dummy text dummy 
dummy {{ foo { bar }} dummy text 
dummy text 
{{}}} 

Результат:

матч 1: {{ text to be matched }}

группа 0: text to be matched

матч 2: {{ foo { bar }}

группа 0: foo { bar

матч 3: {{}}}

группа 0: }

Проблема у меня есть not }} часть, поскольку Javascript не имеет атомных групп.

Я не могу отрицать, не захватывая группы и повторить его, как этот

{{     match {{ 
    (    capture 
     ^(?:}})+ not "}}" 1+ times 
    )    end capture 
}}     match }} 

это /{{(.+)}}/ своего рода работает, но только если у меня нет разрывов строк.

+0

вот почему я не могу просто совместить '{{' anything then '}}'. Это должно быть '{{' ничего, кроме}}, затем '}}' –

+0

Вы пытаетесь сопоставить что-либо между '{{' и '}}'? –

+0

Если '/\{\{(.+)}}/' работает, но не с разрывами строк, можете ли вы просто добавить флаг 'm', например' /\{\{(.+)}}/m'? – Jacob

ответ

3

Чтобы соответствовать вашим требованиям, вы можете использовать этот шаблон:

{{([^}]*(?:}[^}]+)*}*)}} 

детали:

{{ 
(
    [^}]*   # all that is not a closing bracket 
    (?: 
     }[^}]+ # a closing bracket followed by at least one other character 
    )* 
    }*   # eventual closing brackets at the end 
) 
}} 

другой способ (короче, но менее эффективный):

{{([^]*?)}}(?!}) 

Примечание: проблема не имеет ничего общего с атомными группами.

+0

не работает как '{{foo} bar}}', его ok '{{foo }} bar}} ', чтобы соответствовать только' {{foo}} 'tho –

+0

ok, теперь он работает. –

0

Попробуйте это:

/\{\{([\s\S]+?)\}\}/ 

Последовательность [\s\S] является общим для соответствия любой полукокса, включая EOL в. Затем ленивый квантор (+?) экономит день.

0

Этот /{{(.+)}}/ kinda работает, но только если у меня нет разрывов строк.

. в JS регулярное выражение не совпадает с символом новой строки - вы можете пойти с [\s\S] вместо этого в своем регулярном выражении.

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