如果两个分隔符相同,则匹配 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

Demo on regex101

如果 SSN 可能与单词字符相邻,\b 将不起作用(因为数字和单词字符之间没有单词边界)并且您需要使用否定环视来断言 SSN前面或后面没有其他数字:

(?<!\d)(?=[\d. -]{11}(?!\d))\d{1,}([. -])\d{1,}\d{1,}(?!\d)

Demo on regex101

如果 SSN 可能没有分隔符,您只需添加 \d{9}(9 位数字)作为正则表达式的替代:

(?<!\d)(?:(?=[\d. -]{11}(?!\d))\d{1,}([. -])\d{1,}\d{1,}|\d{9})(?!\d)

Demo on regex101

不需要昂贵的前瞻或后视:

\d+(\D)\d+\d+

因为你的问题被标记了 :

ssn.length() == 11 && ssn.matches("\d+(\D)\d+\1\d+")