Регулярное выражение для соответствия {if cond} foo {else} bar {/ if} - PullRequest
0 голосов
/ 13 января 2009

Мне трудно отбросить биты выражения, которое я не хочу, и сохранить биты, которые я делаю.

Проблема в том, что задана строка ввода:

{if cond}foo{else}bar{/if}

Хотелось бы просто иметь:

0: {if cond}foo{else}bar{/if}
1: cond
2: foo
3: bar

А для входной строки:

{if cond}foo{/if}

Я бы хотел иметь:

0: {if cond}foo{else}bar{/if}
1: cond
2: foo
3: 

Регулярное выражение, которое я получил в настоящее время, выглядит следующим образом:

\{if ([a-z0-9]+)\}([^\{]*?)(((?:\{else\})?)(.*?)?)\{/if\}

Я получаю следующие данные:

0: {if cond}foo{else}bar{/if}
1: cond
2:
3: foo{else}bar
4:
5: foo{else}bar

Что потребует дальнейшего разбора бита foo{else}bar для получения соответствующих значений.

Является ли мое регулярное выражение где-нибудь близко?

Меня не слишком беспокоит тип данных, которые могут быть обработаны, включая { в теле оператора if, разрешающего прерывать регулярное выражение Значения foo и bar могут быть любыми, кроме {.

.

Спасибо

Дом

Ответы [ 4 ]

5 голосов
/ 13 января 2009

Это должно работать:

{if\s+([^}]*)}([^{]*)(?:{else}([^{]*))?{/if}

Побег в соответствии с вашими потребностями

2 голосов
/ 13 января 2009

Как насчет этого?

\{if ([a-z0-9]+)\}([^\{]*)(?:\{else\})?([^\{]*)\{/if\}
1 голос
/ 13 января 2009

Тестер регулярных выражений . Он использует механизм регулярных выражений .NET, но может пригодиться.

0 голосов
/ 18 января 2009

В вашем вопросе указано примечание, но из тегов видно, что вы используете библиотеку Boost C ++.

Может быть, вам также будет интересно взглянуть на библиотеку Boost.Spirit (входит в Boost). Spirit.Qi позволяет анализировать сложные данные, а грамматика выглядит как EBNF. В то время как спутник Spirit.Karam позволяет определить формат вывода, опять же в EBNF, как синтаксис.

С помощью этой библиотеки вы можете сгенерировать AST из шаблонного документа, манипулировать им и затем сгенерировать выходной документ.

Помимо документации Boost.Spirit , есть несколько отличных слайдов из 2007 и 2008 , которые дают довольно хорошее представление.

...