正则表达式匹配{if cond} foo {else} bar {/ if}

时间:2009-01-13 16:05:47

标签: c++ regex boost smarty

我很难丢掉我不想要的表达部分,并保留我所做的部分。

问题是 - 给定输入字符串:

{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语句的主体中包括{可以打破正则表达式。 foobar的值可以是不包含{的任何值。

谢谢,

的Dom

4 个答案:

答案 0 :(得分:5)

这应该有效:

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

根据您的需要逃脱

答案 1 :(得分:2)

这个怎么样?

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

答案 2 :(得分:1)

Regex tester。它使用.NET正则表达式引擎,但它可能会派上用场。

答案 3 :(得分:0)

在你的问题中说明了这一点,但是从标签看来你似乎使用了Boost C ++库。

也许你有兴趣看一下Boost.Spirit库(包含在Boost中)。 Spirit.Qi允许您解析复杂数据,而语法看起来像EBNF。虽然伴侣Spirit.Karam允许定义输出格式,但再次使用EBNF语法。

使用此库,您可以从模板化文档生成AST,对其进行操作,然后生成输出文档。

the documentation of Boost.Spirit旁边,有一些来自20072008的精彩幻灯片,会给出相当不错的介绍。