Проверка номера кредитной карты с использованием регулярного выражения - PullRequest
0 голосов
/ 22 сентября 2018

Формат номера кредитной карты: «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: false

temp3: 11111 2222 3333 4444: true 1111 2222 3333 4444 <- <strong>Я не понимаю

temp4: 1111 2a222 3333 4444: false

Ответы [ 2 ]

0 голосов
/ 22 сентября 2018

Вы можете использовать это:

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

b - границы слова

d - цифра

0 голосов
/ 22 сентября 2018

Третий тест пройден, потому что у вас нет якорей вокруг вашего паттерна.Вы должны добавить \b на обоих концах, то есть "\\b[0-9]{4}\\s[0-9]{4}\\s[0-9]{4}\\s[0-9]{4}\\b", чтобы вызвать совпадение в пределах слов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...