正常表达SSN和电话号码

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

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

regex = "^((?!\\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}))$).* 

要解释一下,如果我们阅读您提供的查询:

 ^((?!\\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}$