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