2014-08-29 2 views
3

В настоящее время я пишу регулярное выражение, которое позволит мне использовать базовую условную систему if/else, написанную на JavaScript. (Я знаю, что есть, вероятно, более простые способы сделать это!)Соответствие if/else с регулярным выражением

Это содержание мне нужно работать с:

{?if language = german}Hallo!{?else}Hello!{?endif} 
{?if language = german}{#greeting}{?endif} 

Я написал /{\?if ([^{}]+)}(.+)(?:{\?else})?(.+)?{\?endif}/g, которые, к сожалению, только соответствует части этого. Я использую RegExr для тестирования до сих пор.

Мой ожидаемый результат, используя выходное выражение 1: $1\n2: $2\n3: $3\n, будет:

1: language = german 
2: Hallo! 
3: Hello! 

1: language = german 
2: {#greeting} 
3: 

К сожалению, я получаю вместо этого:

1: language = german 
2: Hallo!{?else}Hello! 
3: 

1: language = german 
2: {#greeting} 
3: 

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

+0

Я согласен, что есть более простые способы сделать это! Но +1 для хорошего четкого вопроса. – Smandoli

+1

Попробуйте использовать неживые кванторы. Поскольку 'else' является факультативным, жадный квантификатор проходит мимо него. – Barmar

ответ

2

Вы сначала хотите сделать + операторами non-greedy. Затем вместо того, чтобы сделать третью группу захвата опциональной, просто поместите эту группу внутри группы, не связанной с захватом, оставив группу Non-captureing необязательной.

/{\?if ([^{}]+)}(.+?)(?:{\?else}(.+?))?{\?endif}/g 

Live Demo

+0

Спасибо, что работает отлично! – Forest

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