2011-02-15 61 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