正则表达式匹配以提取多行文本区域(C#)

时间:2011-02-15 17:58:21

标签: c# regex multiline negative-lookahead

我希望捕获一个大文本块中的文本区域,以下列格式创建:

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

我已经用

解决了这个问题
\[region:(?'link'.*)\](?'text'(.|[\r\n])*)\[/region\]

如果我在整个文本中只有一个区域,则此方法有效。但是,当有多个时,这给了我一个块,其中每个其他“区域”都包含在那个“文本”中。 我有一种感觉,这是使用负面的前瞻来解决,但作为一个非专业的正则表达式,我不知道如何修改上述做正确。 有人可以帮忙吗?

2 个答案:

答案 0 :(得分:4)

你可以不用前瞻地做到这一点:

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

附加?会使*量词变得懒惰,因此它会匹配尽可能少的字符。并且(?s)允许点在此位置后匹配换行符,因此您不必使用(.|[\r\n])构造(替代方法为[\s\S])。

答案 1 :(得分:1)

您不需要否定前瞻,只需要将(?'text'(.|[\r\n])*)更改为“非贪婪”,这样它就会匹配[/region]的第一个实例而不是最后一个实例。您可以在?之后添加*来执行此操作,因此生成的模式将为:

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