结合否定字符和捕获组
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。
(?:(?!\[\[).)*?
部分匹配任何字符 (.
),零个或多个但出现次数尽可能少 (*?
),不以 [[
开头字符序列 ((?!\[\[)
).
(?:(?!\[\[|\][\]\[]).)*
部分匹配任何字符 (.
),零个或多个但尽可能多的出现 (*
),不启动 [[
, [[
或 ][
字符序列 ((?!\[\[|\][\]\[])
).
根据正则表达式的风格,您可以去掉此正则表达式中的一些反斜杠。
目前如何运作
我能够捕获括号之间的值:
[[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。
(?:(?!\[\[).)*?
部分匹配任何字符 (.
),零个或多个但出现次数尽可能少 (*?
),不以 [[
开头字符序列 ((?!\[\[)
).
(?:(?!\[\[|\][\]\[]).)*
部分匹配任何字符 (.
),零个或多个但尽可能多的出现 (*
),不启动 [[
, [[
或 ][
字符序列 ((?!\[\[|\][\]\[])
).
根据正则表达式的风格,您可以去掉此正则表达式中的一些反斜杠。