寻找更清晰的RegEx解决方案来匹配SSN的不同格式

时间:2012-04-05 17:58:08

标签: regex

要查看我想要的内容,请查看我正在使用的正则表达式。我会用英语解释一下。 我想匹配4444444444444444-44-4444。 这就是我所拥有的,也是我想要的。

^[0-9]{9}$|^[0-9]{4}$|^[0-9]{3}-[0-9]{2}-[0-9]{4}$

如果没有OR,有没有办法做到这一点?我想过这样做

([0-9]{3}-?[0-9]{2}-?)?[0-9]{4}

但这允许我想要排除的222-222222

2 个答案:

答案 0 :(得分:1)

你应该可以通过反向引用来做到这一点:

^(?:\d{3}(-?)\d{2}\1)?\d{4}$

如果存在-,则会捕获该\1,并可以使用\1引用该-。如果它不存在,{{1}}将为空。所以它实质上意味着:如果{{1}}在那个位置,它也必须在另一个位置。

DEMO

答案 1 :(得分:0)

标记为答案实际的模式失败,因为它与美国规范的有效SSN号码不匹配!

使用匹配无效器,此模式可以工作,并根据政府规范Social Security Number Randomization

抛出000和666或以9xx开头的数字
# To use this regex pattern specify IgnoreWhiteSpace due to these comments.
^                           # Beginning of line anchor      
(?!9)                       # Can't be 900- 999                                   
(?!000)                     # If it starts with 000 its bad (STOP MATCH!)
(?!666)                     # If it starts with 666 its bad (STOP MATCH!)
(?<FIRST>\d{3})             # Match the First three digits and place into First named capture group
(?:[\s\-]?)                 # Match but don't capture a possible space or dash
(?<SECOND>\d\d)             # Match next two digits
(?:[\s-]?)                  # Match but don't capture a possible space or dash
(?<THIRD>\d{4})             # Match the final for digits
$                           # EOL anchor

我在博客文章Regular Expression (Regex) Match Invalidator (?!) in .Net上描述了匹配无效器的使用。