我希望捕获一个大文本块中的文本区域,以下列格式创建:
...
[region:region-name]
multi line
text block
[/region]
...
[region:another-region-name]
more
multi-line text
[/region]
我已经用
解决了这个问题\[region:(?'link'.*)\](?'text'(.|[\r\n])*)\[/region\]
如果我在整个文本中只有一个区域,则此方法有效。但是,当有多个时,这给了我一个块,其中每个其他“区域”都包含在那个“文本”中。 我有一种感觉,这是使用负面的前瞻来解决,但作为一个非专业的正则表达式,我不知道如何修改上述做正确。 有人可以帮忙吗?
答案 0 :(得分:4)
你可以不用前瞻地做到这一点:
\[region:(?'link'.*)\](?'text'(?s).*?)\[/region\]
附加?
会使*
量词变得懒惰,因此它会匹配尽可能少的字符。并且(?s)
允许点在此位置后匹配换行符,因此您不必使用(.|[\r\n])
构造(替代方法为[\s\S]
)。
答案 1 :(得分:1)
您不需要否定前瞻,只需要将(?'text'(.|[\r\n])*)
更改为“非贪婪”,这样它就会匹配[/region]
的第一个实例而不是最后一个实例。您可以在?
之后添加*
来执行此操作,因此生成的模式将为:
\[region:(?'link'.*)\](?'text'(.|[\r\n])*?)\[/region\]