正则表达式负面向前看以匹配降价链接

Enr*_*one 5 .net regex regex-lookarounds

我们陷入了正则表达式问题.

这是问题所在.考虑以下两种模式:

1) [hello] [world]

2) [hello [world]]

我们需要编写一个只能[world]在第一个匹配的正则表达式和[hello [world]]第二个匹配的整个模式().

通过使用负向前瞻,我编写了以下正则表达式,它解决了部分问题:

\[[^\[\]]+\](?!.*\[[^\[\]]+\])
Run Code Online (Sandbox Code Playgroud)

这个正则表达式匹配模式1)我们想要,但不适用于模式2).

Wik*_*żew 2

在 .NET 正则表达式中,您可以使用平衡组来匹配嵌套的平衡括号。因此,要匹配一行上的最后一个[...]子字符串(带有嵌套括号),您需要相当长的模式,例如

\[(?:[^][]+|(?<c>)\[|(?<-c>)])*(?(c)(?!))](?!.*\[(?:[^][]+|(?<d>)\[|(?<-d>)])*(?(d)(?!))])
Run Code Online (Sandbox Code Playgroud)

请参阅RegexStorm.net 上的正则表达式演示

细节

  • \[(?:[^][]+|(?<c>)\[|(?<-c>)])*(?(c)(?!))]-[...]带有嵌套括号的子字符串:
    • \[- 一个[字符
    • (?:[^][]+|(?<c>)\[|(?<-c>)])*- 零次或多次出现:
      • [^][]+|- 除]and [or之外的 1 个或多个字符
      • (?<c>)\[|- 空值添加到组“c”并且a[匹配
      • (?<-c>)]- 从“c”组堆栈中减去空值并]匹配a
    • (?(c)(?!))- 如果“c”组堆栈不为空,则匹配失败的条件
    • ] - 一个]字符
  • (?!.*\[(?:[^][]+|(?<d>)\[|(?<-d>)])*(?(d)(?!))])- 除了换行符号之外,后面不跟任何 0+ 字符,其后面的模式与上面的模式相同。