使用正则表达式验证信用卡号

时间:2018-09-22 05:20:34

标签: regex credit-card

信用卡号格式为:“ nnnn nnnn nnnn nnnn”

我使用此模式在下面测试了四个字符串,但是temp3字符串意外返回true。

我不知道怎么了。我正在使用的正则表达式应正确验证四位数和一个空格,但是temp3会返回true,即使不匹配此模式。

String temp1 = " adfs 1111 2222 3333 4444 fadad";  // outer test
String temp2 = "11 11 2222 3333 4444"; // inner test
String temp3 = "11111 2222 3333 4444"; // inner test
String temp4 = "1111 2a222 3333 4444"; // inner test

public String chkContainCardno(String inputstr) {

    Pattern p = Pattern.compile("[0-9]{4}\\s[0-9]{4}\\s[0-9]{4}\\s[0-9]{4}");
    Matcher m = p.matcher(inputstr);

    if (m.find()) {
        return m.group(0);
    } else {
        return ErrMsg.Does_Not_Contain_Card_No;
    }
}

[测试结果]

temp1:adfs 1111 2222 3333 4444 fadad:true 1111 2222 3333 4444

temp2:11 11 2222 3333 4444:错误

temp3:11111 2222 3333 4444:是1111 2222 3333 4444 <-我不明白

temp4:1111 2a222 3333 4444:否

2 个答案:

答案 0 :(得分:1)

第三次测试通过,因为您的模式周围没有锚点。您应该在任一端添加\b,即"\\b[0-9]{4}\\s[0-9]{4}\\s[0-9]{4}\\s[0-9]{4}\\b",以在单词边界内强制匹配。

答案 1 :(得分:0)

您可以使用此:

"(\\b\\d{4}\\s\\d{4}\\s\\d{4}\\s\\d{4}\\b)"

b-单词边界

d-数字