您可以尝试:
^(?!((\d{9})|(\d{3}-\d{2}-\d{4})|(\d{3}-\d{3}-\d{3}))$).*
解释一下,如果我们阅读了您提供的查询:
^((?!\d[9]$)|(?!(\d{3}-?\d{2}-?\d{4}$)|(?!(\d{3}-?\d{3}-?\d{3})$)$
我们可以读到:(
is not followed by xxxxxxxxx OR is not followed by xxx-xx-xxxx OR isnot followed by xxx-xxx-xxx在我的顶部版本中,我改写为:
is not (xxxxxxxxx OR xxx-xx-xxxx ORxxx-xxx-xxx)。)。
保证世界上任何字符串都不匹配其中至少两个,因此它们的组合始终为真,从而为您提供了一个简单得多的有效正则表达式:
^$
?!是零宽度的断言,因此它不消耗任何东西。即使匹配先行检查所检查的内容,也不会消耗输入,因此您永远都不会达到$,这是先行之外所必需的。只需
.*在最终
$解决方案之前添加即可。
我认为,您的连字符后不应加上?。将它们设为可选,意味着您还匹配
xxx-xxxxxx和
xxx-xx-x-xxx。如果您打算这样做,则可以将它们添加回去,或大大简化您的正则表达式,以:
^(?!\d{3}-?\d{2}-?\d-?\d{3}$).*
另一个问题是
\d[9]$应
\d{9}$
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)