多重否定前瞻

时间:2016-04-25 17:45:42

标签: regex negative-lookahead

前三个字符必须是大写字母,不包括I,O,S或Z.然后一个短划线然后四个字符可以是除了3之外的任何东西。我有这个但是第一个负向前瞻是捕获第一个之外的东西捕获组。

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

我想捕获AAA-444Z

2 个答案:

答案 0 :(得分:0)

您可以使用此正则表达式来满足此要求的任何前瞻:

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

https://jsfiddle.net/gkke38wk/4/

根据下面的评论,如果你真的想要负面的前瞻,那么只能使用:

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

RegEx Demo

答案 1 :(得分:0)

您应该从前瞻中删除.*,因为您希望匹配3个字符并将限制编号从捕获组中删除。最后一部分也使用否定的字符类:

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

minecraft forums

如果您想使用以下两个负向使用,请执行以下操作:

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

Demo

请注意,当您使用环视时,您希望指定模式在特定模式之后或之前,并且当您想要提示字符数时需要说正则表达式引擎要考虑整个基于环视的模式的限制。在第一个(?![IOSZ])[A-Z])和第二个((?!3).)