对于SSN和电话号码的正则表达式[关闭](Regular expression for SSN an

2019-08-05 03:58发布

字符串不应该包含SSN或电话号码。 正则表达式如下不起作用,只接受XXXXXXXXX格式。

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

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

Answer 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}$



文章来源: Regular expression for SSN and phone number [closed]