该字符串不应包含 SSN 或电话号码。下面的正则表达式不起作用,它只接受 xxxxxxxxx 格式。
不应包含xxx-xx-xxxx
orxxx-xxx-xxx
或xxxxxxxxx
。
regex = "^((?!\\d[9]$)|(?!(\\d{3}-?\\d{2}-?\\d{4}$)|(?!(\\d{3}-?\\d{3}-?\\d{3})$)$";
该字符串不应包含 SSN 或电话号码。下面的正则表达式不起作用,它只接受 xxxxxxxxx 格式。
不应包含xxx-xx-xxxx
orxxx-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}$