我很难丢掉我不想要的表达部分,并保留我所做的部分。
问题是 - 给定输入字符串:
{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
的值可以是不包含{
的任何值。
谢谢,
的Dom
答案 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旁边,有一些来自2007和2008的精彩幻灯片,会给出相当不错的介绍。