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

正则表达式匹配打开以提取多行文本区域(C#),c#,regex,multiline,negative-lookahead,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\] 如果我在整个文本中只有一个区域,这是可行的。但是,当有

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

...
[region:region-name]
multi line
text block
[/region]
...
[region:another-region-name]
more
multi-line text
[/region]
我几乎和你一起解决了这个问题

\[region:(?'link'.*)\](?'text'(.|[\r\n])*)\[/region\]
如果我在整个文本中只有一个区域,这是可行的。但是,当有多个块时,这只会给我一个块,而该块的“文本”中包含其他每个“区域”。 我有一种感觉,这是要解决使用一个消极的前瞻性,但作为一个非专业的正则表达式,我不知道如何修改上述做它的权利。
有人能帮忙吗

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

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

您可以在不进行前瞻的情况下执行此操作:

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

附加的
使
*
量词变懒,因此它将匹配尽可能少的字符。而
(?s)
允许点匹配此位置后的换行符,因此您不必使用
(.|[\r\n])
结构(另一种方法是
[\s\s]
)。

谢谢!这很有效。也谢谢你清理我的正则表达式:)谢谢!我使用了蒂姆的建议,但没有尝试。但是,看起来这也会起作用。