2009-01-13 79 views
0

我很難擺脫我不想要的表達式,並保留我做的位。正則表達式匹配{if cond} foo {else} bar {/ if}

的問題是 - 定的輸入字符串:

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

我想正好有:

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

而對於輸入字符串:

{if cond}foo{/if} 

我d只想擁有:

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的值可以是任何不包含{的值。

感謝,

大教堂

+0

你可以簡單地編輯你以前的問題? – AnthonyWJones 2009-01-13 16:09:08

+0

我沒有意識到我發佈了它 - 我很快就點擊了後退按鈕,這讓我感到很慚愧。 – 2009-01-13 16:13:39

+0

如果你願意,我可以關閉這個並編輯並重新打開另一個? – 2009-01-13 16:14:11

回答

2

這個是什麼?

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

這應該工作:

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

逃避它根據自己的需要

1

Regex tester。它使用.NET正則表達式引擎,但它可能派上用場。

0

它是在你的問題中說明,但從標籤看來,你使用Boost C++庫。

也許你也有興趣看看Boost.Spirit庫(包括在Boost中)。 Spirit.Qi允許您解析複雜的數據,而語法看起來像EBNF。而伴侶Spirit.Karam允許定義輸出格式,同樣在EBNF類似的語法中。

使用此庫,您可以從模板化文檔生成AST,對其進行處理,然後生成輸出文檔。

除了the documentation of Boost.Spirit之外,還有一些來自20072008的幻燈片,給出了相當不錯的介紹。