【问题标题】:Regular expression for SSN and phone number [closed]SSN和电话号码的正则表达式[关闭]
【发布时间】:2012-12-15 17:53:12
【问题描述】:

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

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

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

【问题讨论】:

  • “不起作用”没有帮助;请给出具体例子。
  • 你的正则表达式看起来很复杂。我不确定我是否理解您在寻找什么,但据我所知,这是否有效:^\d{3}-?\d{2}-?\d-?\d{3}$
  • 字符串不应包含 xxx-xxx-xxx 或 xxx-xx-xxxx 或 xxxxxxxxx(9 位)数字。是什么 ?对于
  • 这也将取消科罗拉多州、康涅狄格州、密西西比州和新墨西哥州的美国驾照。这会是个问题吗?
  • @user679526 什么字符串?你用它做什么?

标签: java regex regex-negation


【解决方案1】:

你可以试试:

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

【讨论】:

  • aa 123-123-124 不是有效字符串,但上面的正则表达式允许它。
  • 没错。如果您想阻止匹配的任何字符串包含出现在字符串中任何位置的这种模式,^(?!.*(\\d{9})|(\\d{3}-\\d{2}-\\d{4})|(\\d{3}-\\d{3}-\\d{3})).* 会这样做。
  • 我将正则表达式更改为 ^(?!.*(\\d{16})|.*(\\d{9})|.*(\\d{3}-\ \d{2}-\\d{4})|.*(\\d{3}-\\d{3}-\\d{3})).* 验证“文本 123123123”和“ 123123123 文本"
猜你喜欢
  • 1970-01-01
  • 2017-09-23
  • 2014-02-15
  • 2012-04-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多