使用pattern.compile作为社会安全号码

时间:2015-04-07 15:42:08

标签: java regex

我们要求社会安全号码必须在表格中 “xxxx-xx-nnnn”(x是文字,n代表数字,有效值是xxx-xx-5444。

我正在尝试使用Java Pattern和matcher。所以我做了以下

String SSN_REGEXP = "xxx-xx-[0-9][0-9][0-9][0-9]";
...
assertTrue( "SSN " + ssn + " is not of format " + SSN_REGEXP, Pattern.compile(SSN_REGEXP).matcher(ssn).matches());

如果第二个参数为false,则assertTrue将打印第一个参数。在这种情况下,如果模式不匹配。

我得到了这个:

java.lang.AssertionError: SSN  xxx-xx-5444 is not of format xxx-xx-[0-9][0-9][0-9][0-9]

如您所见,SSN是“xxx-xx-5444”。那为什么会失败呢? 我也尝试了以下内容:

"^xxx-xx-[0-9][0-9][0-9][0-9]$"
"xxx\\-xx\\-[0-9][0-9][0-9][0-9]"
在Java中,你必须加倍反斜杠,我认为因为有两个间接级别,并且 - 表示无效转义。

那么为什么正则表达式不起作用?

2 个答案:

答案 0 :(得分:1)

ssn的第一个字符实际上是一个空格:

java.lang.AssertionError: SSN  xxx-xx-5444 is not of format xxx-xx-[0-9][0-9][0-9][0-9]
                              ^

您的正则表达式不允许在此位置留出空间。最好的方法是在验证输入字符串之前修剪输入字符串:Pattern.compile(SSN_REGEXP).matcher(ssn.trim()).matches()

请注意matches()匹配模式的整个输入字符串。如果要在字符串中查找模式,则必须使用find()

答案 1 :(得分:0)

看起来你在ssn的开头有一个空格。 ssn是:xxx-xx-5444。但它应该是xxx-xx-5444

当我们检查打印的字符串的这一部分:SSN xxx时,我们可以看到那里有两个空格。