多重负先行

Multiple Negative Lookahead

前三个字符必须是大写字母,不包括 I、O、S 或 Z。然后是一个破折号,然后是四个字符,可以是除 3 以外的任何字符。我有这个,但第一个否定前瞻也在捕获之外的东西第一个捕获组。

^((?!.*[IOSZ])[A-Z]{3})-((?!.*3)(.{4}))$

例如,我想捕获 AAA-444Z

您不需要提前了解此要求,因为您可以使用此正则表达式:

^[A-HJ-NP-RT-Y]{3}-[^3]{4}$
  • [A-HJ-NP-RT-Y]{3} 将匹配 3 个不是 I, O, S or Z.
  • 的大写字母实例
  • [^3]{4} 匹配任何非 3.
  • 的字符

RegEx Demo

根据下面的评论,如果你真的想要否定前瞻,那么请使用:

^(?:(?![IOSZ])[A-Z]){3}-(?:(?!3).){4}$

Regex Demo 2

你应该从你的前瞻中删除 .*,因为你想要匹配 3 个字符并将限制数字放在捕获组之外。最后一部分也使用否定字符 class:

^((?![IOSZ])[A-Z]){3}-[^3]{4}$

Demo

如果你想使用两个负前瞻使用以下:

^((?![IOSZ])[A-Z]){3}-((?!3).){4}$

Demo

请注意,要点是,当您使用环视时,您想要指定一个模式在一个特殊模式之后或之前,以及当您想要对需要告诉正则表达式引擎的字符数进行 lint 时考虑整个基于环视模式的限制。第一个 (?![IOSZ])[A-Z]) 和第二个 ((?!3).).