一尘不染

SSN和电话号码的正则表达式

java

该字符串不应包含SSN或电话号码。下面的正则表达式不起作用,它仅接受xxxxxxxxx格式。

不应包含xxx-xx-xxxxxxx-xxx-xxxxxxxxxxxx

regex = "^((?!\\d[9]$)|(?!(\\d{3}-?\\d{2}-?\\d{4}$)|(?!(\\d{3}-?\\d{3}-?\\d{3})$)$";


阅读 142

收藏
2020-12-03

共1个答案

一尘不染

您可以尝试:

^(?!((\\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 is not followed by xxx-xxx-xxx在我的顶部版本中,我改写为:is not (xxxxxxxxx OR xxx-xx-xxxx OR xxx-xxx-xxx)。)。

保证世界上任何字符串都不匹配其中至少两个,因此它们的组合始终为真,从而为您提供了一个简单得多的有效正则表达式:

^$

?!是零宽度的断言,因此它不消耗任何东西。即使匹配先行检查所检查的内容,也不会消耗输入,因此您永远都不会达到$,这是先行之外所必需的。只需.*在最终$解决方案之前添加即可。

我认为,您的连字符后不应加上?。将它们设为可选,意味着您还匹配xxx-xxxxxxxxx-xx-x- xxx。如果您打算这样做,则可以将它们添加回去,或大大简化您的正则表达式,以:

^(?!\\d{3}-?\\d{2}-?\\d-?\\d{3}$).*

另一个问题是\\d[9]$\\d{9}$

2020-12-03