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

Sam*_*era 3 c# regex multiline negative-lookahead

我正在寻找以以下格式创建的大文本块中的文本区域:

...
[region:region-name]
multi line
text block
[/region]
...
[region:another-region-name]
more
multi-line text
[/region]
Run Code Online (Sandbox Code Playgroud)

我几乎解决了这个问题

\[region:(?'link'.*)\](?'text'(.|[\r\n])*)\[/region\]
Run Code Online (Sandbox Code Playgroud)

如果我在整个文本中只有一个区域,这会起作用。但是,当有多个时,这只会给我一个块,其中包含在该块的“文本”中的所有其他“区域”。我有一种感觉,这将使用负面展望来解决,但作为正则表达式的非专业人士,我不知道如何修改上述内容以正确处理。有人可以帮忙吗?

Tim*_*ker 5

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

\[region:(?'link'.*)\](?'text'(?s).*?)\[/region\]
Run Code Online (Sandbox Code Playgroud)

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