我可以使用以下方式匹配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有关,但这会打破我需要它做的事情。
答案 0 :(得分:3)
以下正则表达式会查找此格式中的数字xxx-xx-xxxx
仅存在于空格或起点之后,后跟空格或行尾。 ,
(?<=\s|^)\b\d{3}-\d{2}-\d{4}\b(?=\s|$)
<强>解释强>
(?<=\s|^)
后视用于查看空格或起点。\b
单词和非单词字符之间的匹配。\d{3}-\d{2}-\d{4}
NUmber格式。它必须是xxx-xx-xxxx \b
单词和非单词字符之间的匹配。(?=\s|$)
前瞻用于检查数字后面的那个是空格还是行末。