Enr*_*one 5 .net regex regex-lookarounds
我们陷入了正则表达式问题.
这是问题所在.考虑以下两种模式:
1) [hello] [world]
2) [hello [world]]
我们需要编写一个只能[world]在第一个匹配的正则表达式和[hello [world]]第二个匹配的整个模式().
通过使用负向前瞻,我编写了以下正则表达式,它解决了部分问题:
\[[^\[\]]+\](?!.*\[[^\[\]]+\])
Run Code Online (Sandbox Code Playgroud)
这个正则表达式匹配模式1)我们想要,但不适用于模式2).
在 .NET 正则表达式中,您可以使用平衡组来匹配嵌套的平衡括号。因此,要匹配一行上的最后一个[...]子字符串(带有嵌套括号),您需要相当长的模式,例如
\[(?:[^][]+|(?<c>)\[|(?<-c>)])*(?(c)(?!))](?!.*\[(?:[^][]+|(?<d>)\[|(?<-d>)])*(?(d)(?!))])
Run Code Online (Sandbox Code Playgroud)
细节
\[(?:[^][]+|(?<c>)\[|(?<-c>)])*(?(c)(?!))]-[...]带有嵌套括号的子字符串:
\[- 一个[字符(?:[^][]+|(?<c>)\[|(?<-c>)])*- 零次或多次出现:
[^][]+|- 除]and [or之外的 1 个或多个字符(?<c>)\[|- 空值添加到组“c”并且a[匹配(?<-c>)]- 从“c”组堆栈中减去空值并]匹配a(?(c)(?!))- 如果“c”组堆栈不为空,则匹配失败的条件] - 一个]字符(?!.*\[(?:[^][]+|(?<d>)\[|(?<-d>)])*(?(d)(?!))])- 除了换行符号之外,后面不跟任何 0+ 字符,其后面的模式与上面的模式相同。