结合否定字符和捕获组

Combine negated characters and capture groups

目前如何运作

我能够捕获括号之间的值:

[[two b][three c]]

结果是

two b
three c

正则表达式

\[\[(.+?)\]\[(.+?)\]\]

当我使用这个字符串时

[[one a]]

没有捕获任何内容,这正是我所期望的。很好。

问题

我组合字符串

[[one a]] and [[two b][three c]]

已捕获

one a]] and [[two b
three c

我的理解

据我了解,可能的方法是否定 ]] 字符串。但我不知道该怎么做。而且我不确定这是否是正确的方法。

. 字符匹配除换行字符以外的任何字符,并且用惰性量词量化的事实并不限制它匹配基本上任何字符(从左到右搜索匹配项,因此,匹配的 [[ 是最左边的 [[,下一个 ][ 匹配,无论中间是否有 []

因此,一种方法是使用否定字符 class [^\]\[]:

排除 [[][ 之间的任何方括号
\[\[([^\]\[]+)\]\[([^\]\[]+)\]\]

regex demo。此处,替换 .+?[^\]\[]+ 匹配除 [].

之外的一个或多个字符

另一种方法是您提到的方法,即在 ][:

之前匹配任何不以 [[ 开头(也可能是 ]])的字符
\[\[((?:(?!\[\[).)*?)\]\[(.*?)\]\]
\[\[((?:(?!\[\[|\][\]\[]).)*)\]\[(.*?)\]\]

参见 this regex demo

(?:(?!\[\[).)*? 部分匹配任何字符 (.),零个或多个但出现次数尽可能少 (*?),不以 [[ 开头字符序列 ((?!\[\[)).

(?:(?!\[\[|\][\]\[]).)* 部分匹配任何字符 (.),零个或多个但尽可能多的出现 (*),不启动 [[ , [[][ 字符序列 ((?!\[\[|\][\]\[])).

根据正则表达式的风格,您可以去掉此正则表达式中的一些反斜杠。