3

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

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

我几乎解决了这个问题

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

如果我在整个文本中只有一个区域,则此方法有效。但是,当有多个时,这给了我一个块,每个其他“区域”都包含在该块的“文本”中。我有一种感觉,这是要通过消极的展望来解决的,但是作为一个非正则表达式的非专业人士,我不知道如何修改上述内容以使其正确。有人可以帮忙吗?

4

2 回答 2

5

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

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

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

于 2011-02-15T18:02:53.867 回答
1

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

\[region:(?'link'.*)\](?'text'(.|[\r\n])*?)\[/region\]
于 2011-02-15T18:02:44.347 回答