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

时间:2012-12-31 16:24:29

标签: java regex regex-negation

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

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

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

1 个答案:

答案 0 :(得分:4)

您可以尝试:

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