该字符串不应包含SSN或电话号码。下面的正则表达式不起作用,它只接受xxxxxxxxx格式。
不应包含xxx-xx-xxxx
或xxx-xxx-xxx
或xxxxxxxxx
。
regex = "^((?!\\d[9]$)|(?!(\\d{3}-?\\d{2}-?\\d{4}$)|(?!(\\d{3}-?\\d{3}-?\\d{3})$)$";
答案 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-xxxxxx
和xxx-xx-x-xxx
。如果是这样的话,你可以将它们添加回去,或者大大简化你的正则表达式,以便:
^(?!\\d{3}-?\\d{2}-?\\d-?\\d{3}$).*
另一个问题是\\d[9]$
应为\\d{9}$