如果两个分隔符相同,则匹配 SSN 模式
Match the SSN patterns if both delimiter are same
仅当两个分隔符都应匹配时才需要匹配 ssn 号码。但下面的代码匹配所有。
((?:\d[-.\s]*?){9})
输入:
list of ssn are 222-33-4444, 333.77-8888 and 111 77.9998 and 111 22 3333 and 11-222222-9
预期输出:
222-33-4444
111 22 3333
11-222222-9
您可以捕获第一个分隔符,然后使用 back-reference 断言第二个分隔符是相同的字符。由于格式在分隔符放置方面可以是可变的,因此您还需要断言有 9 位数字和 2 个分隔符:
\b(?=[\d. -]{11}\b)\d{1,}([. -])\d{1,}\d{1,}\b
如果 SSN 可能与单词字符相邻,\b
将不起作用(因为数字和单词字符之间没有单词边界)并且您需要使用否定环视来断言 SSN前面或后面没有其他数字:
(?<!\d)(?=[\d. -]{11}(?!\d))\d{1,}([. -])\d{1,}\d{1,}(?!\d)
如果 SSN 可能没有分隔符,您只需添加 \d{9}
(9 位数字)作为正则表达式的替代:
(?<!\d)(?:(?=[\d. -]{11}(?!\d))\d{1,}([. -])\d{1,}\d{1,}|\d{9})(?!\d)
不需要昂贵的前瞻或后视:
\d+(\D)\d+\d+
因为你的问题被标记了 java:
ssn.length() == 11 && ssn.matches("\d+(\D)\d+\1\d+")
仅当两个分隔符都应匹配时才需要匹配 ssn 号码。但下面的代码匹配所有。
((?:\d[-.\s]*?){9})
输入:
list of ssn are 222-33-4444, 333.77-8888 and 111 77.9998 and 111 22 3333 and 11-222222-9
预期输出:
222-33-4444
111 22 3333
11-222222-9
您可以捕获第一个分隔符,然后使用 back-reference 断言第二个分隔符是相同的字符。由于格式在分隔符放置方面可以是可变的,因此您还需要断言有 9 位数字和 2 个分隔符:
\b(?=[\d. -]{11}\b)\d{1,}([. -])\d{1,}\d{1,}\b
如果 SSN 可能与单词字符相邻,\b
将不起作用(因为数字和单词字符之间没有单词边界)并且您需要使用否定环视来断言 SSN前面或后面没有其他数字:
(?<!\d)(?=[\d. -]{11}(?!\d))\d{1,}([. -])\d{1,}\d{1,}(?!\d)
如果 SSN 可能没有分隔符,您只需添加 \d{9}
(9 位数字)作为正则表达式的替代:
(?<!\d)(?:(?=[\d. -]{11}(?!\d))\d{1,}([. -])\d{1,}\d{1,}|\d{9})(?!\d)
不需要昂贵的前瞻或后视:
\d+(\D)\d+\d+
因为你的问题被标记了 java:
ssn.length() == 11 && ssn.matches("\d+(\D)\d+\1\d+")