正则表达式正向预测不会阻止匹配
Regex positive look-ahead not preventing a match
如果this regex:
^(?:(?:\([^\(\)]+\))|(?:(?<!\()[^\(\)]+(?!\))))$
匹配 abc
和 (abc)
但不匹配 (abc
或 abc)
,为什么我不能在正向预测 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 组匹配(如果有左括号)匹配 )
$
- 字符串结尾。
如果this regex:
^(?:(?:\([^\(\)]+\))|(?:(?<!\()[^\(\)]+(?!\))))$
匹配 abc
和 (abc)
但不匹配 (abc
或 abc)
,为什么我不能在正向预测 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 组匹配(如果有左括号)匹配)
$
- 字符串结尾。