我们要求社会安全号码必须在表格中 “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中,你必须加倍反斜杠,我认为因为有两个间接级别,并且 - 表示无效转义。
那么为什么正则表达式不起作用?
答案 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
时,我们可以看到那里有两个空格。