正则表达式正向预测不会阻止匹配

Regex positive look-ahead not preventing a match

如果this regex:

^(?:(?:\([^\(\)]+\))|(?:(?<!\()[^\(\)]+(?!\))))$

匹配 abc(abc) 但不匹配 (abcabc),为什么我不能在正向预测 like this 中使用它?

^(?=(?:(?:\([^\(\)]+\))|(?:(?<!\()[^\(\)]+(?!\)))))(?:\(?[a-z]+\)?)$

例如匹配abc)

您的第一个正则表达式可以简化为 ^(?:\([^()]+\)|[^()]+)$。当你在lookahead中使用它的时候,你没有在最后锚定它,你没有使用$。所以,直接 "quick fix" 看起来像

^(?=(?:\([^()]+\)|[^()]+)$)\(?[a-z]+\)?$

参见regex demo

第二个正则表达式也可以写成 ^(?:\([a-z]+\)|[a-z]+)$,有两种选择,要么匹配括号内的小写字母字符串,要么不匹配。

在 .NET 中,您还可以使用

^(\()?[a-z]+(?(1)\))$

参见 demo

详情

  • ^ - 字符串开头
  • (\()? - 匹配 (
  • 的可选捕获组 #1
  • [a-z]+ - 1+ 个小写字母(\p{Ll}+ 匹配任何小写 Unicode 字母)
  • (?(1)\)) - 条件构造:如果第 1 组匹配(如果有左括号)匹配 )
  • $ - 字符串结尾。