Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/152.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 匹配{if cond}foo{else}bar{/if}的正则表达式_C++_Regex_Boost_Smarty - Fatal编程技术网

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

C++ 匹配{if cond}foo{else}bar{/if}的正则表达式,c++,regex,boost,smarty,C++,Regex,Boost,Smarty,我很难扔掉我不想要的表达,而保留我想要的表达 问题是-给定输入字符串: {if cond}foo{else}bar{/if} {if cond}foo{/if} 我只想要: 0: {if cond}foo{else}bar{/if} 1: cond 2: foo 3: bar 0: {if cond}foo{else}bar{/if} 1: cond 2: foo 3: 对于输入字符串: {if cond}foo{else}bar{/if} {if cond}foo{/if} 我只

我很难扔掉我不想要的表达,而保留我想要的表达

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

{if cond}foo{else}bar{/if}
{if cond}foo{/if}
我只想要:

0: {if cond}foo{else}bar{/if}
1: cond
2: foo
3: bar
0: {if cond}foo{else}bar{/if}
1: cond
2: foo
3: 
对于输入字符串:

{if cond}foo{else}bar{/if}
{if cond}foo{/if}
我只想要:

0: {if cond}foo{else}bar{/if}
1: cond
2: foo
3: bar
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语句体中破坏regex的{,foo和bar的值可以是任何不包含{的数据

谢谢

Dom

这应该可以:

{if\s+([^}]*)}([^{]*)(?:{else}([^{]*))?{/if}
根据你的需要逃离它

这个呢

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

使用.NET ReGEX引擎,但它可能会派上用场。

< P>这是你的问题中所陈述的,但是从标签看来,你使用Boost C++库。

您可能还对Boost.Spirit.Qi中包含的Boost.Spirit库感兴趣,它允许您解析复杂的数据,而语法类似于EBNF。而配套的Spirit.Karam则允许您定义输出格式,同样使用类似于EBNF的语法

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


除此之外,还有一些来自和的大型幻灯片,它们提供了一个相当好的介绍。

你可以简单地编辑你之前的问题??我不知道我已经发布了它-我相当快地点击了后退按钮,这让我感到很惭愧。如果你愿意,我可以关闭这张幻灯片,编辑并重新打开另一张?效果很好-谢谢!真的很好d一个额外的部分整个表达式在0和1中,但我可以接受。只要去掉最外面的一组括号就行了。它工作得很好,没有Diadistis的额外部分,所以我将把它标记为接受。谢谢!每次你硬连线[a-z],你保证它只在ASCII数据上工作,而不是在Unicode数据上。