在没有前导或尾随破折号的情况下在任何地方匹配SSN

时间:2014-07-01 17:38:19

标签: regex

我可以使用以下方式匹配SSN:

\b\d{3}-\d{2}-\d{4}\b

很容易匹配:

123-45-1234

John Doe SSN# 123-12-1235

问题是它也会匹配:

100-123-45-1234-99

1010-23-3--123-23-1234-56-712

短划线不会被识别为单词边界的一部分。我不能使用^因为SSN有时在句子中或具有前导空格。 - SSN并不总是从一行的开头开始。

我不知所措。

我尝试使用\ A但似乎无法正常工作

\A\d{3}-\d{2}-\d{4}

仅匹配

123-45-1234

不匹配:

John Smith, SSN, 123-45-1234

我基本上需要在一行中的任何地方准确捕获SSN的数字和短划线,除非它有一个前导或尾随短划线。

我一直在rubular.com上测试这个,但找不到解决方案。我能找到的所有解决方案都与使用^来识别行的起点或\ A有关,但这会打破我需要它做的事情。

1 个答案:

答案 0 :(得分:3)

以下正则表达式会查找此格式中的数字xxx-xx-xxxx仅存在于空格或起点之后,后跟空格或行尾。 ,

(?<=\s|^)\b\d{3}-\d{2}-\d{4}\b(?=\s|$)

DEMO

<强>解释

  • (?<=\s|^)后视用于查看空格或起点。
  • \b单词和非单词字符之间的匹配。
  • \d{3}-\d{2}-\d{4} NUmber格式。它必须是xxx-xx-xxxx
  • \b单词和非单词字符之间的匹配。
  • (?=\s|$)前瞻用于检查数字后面的那个是空格还是行末。