2011-02-15 66 views
2

我期待捕捉文本區域在一個大的文本塊,按以下格式創建的:正則表達式匹配上提取多行文本區(C#)

... 
[region:region-name] 
multi line 
text block 
[/region] 
... 
[region:another-region-name] 
more 
multi-line text 
[/region] 

我有這個幾乎與摸索出

\[region:(?'link'.*)\](?'text'(.|[\r\n])*)\[/region\] 

如果我只在整個文本中有一個區域,這可以工作。但是,當有多個時,這給了我一個塊,包含在那個「文本」中的其他「區域」。 我有一種感覺,這是要解決使用負面展望,但作爲一個非正式與正則表達式,我不知道如何修改上述做正確的。 有人可以幫忙嗎?

回答

4

你可以做到這一點沒有前瞻:

\[region:(?'link'.*)\](?'text'(?s).*?)\[/region\] 

附加?使得*量詞懶惰,所以它會匹配儘可能少的字符。並且(?s)允許點在此位置之後匹配換行符,因此您不必使用(.|[\r\n])構造(替代方案是[\s\S])。

+0

謝謝!這很好。也謝謝你清理我的正則表達式:) – Sameera 2011-02-16 02:52:52

1

您不需要負向預測,只需要將(?'text'(.|[\r\n])*)更改爲「非貪婪」,以便它將匹配[/region]的第一個實例而不是最後一個。您可以通過*後加入?做到這一點,因此產生的模式將是:

\[region:(?'link'.*)\](?'text'(.|[\r\n])*?)\[/region\] 
+0

謝謝!我在上面使用了Tim的建議,並沒有嘗試這個。但是,它看起來也會起作用。 – Sameera 2011-02-16 02:54:34