Java Regex – Проверка номера кредитной карты

В этом уроке по регулярным выражениям Java мы научимся использовать регулярные выражения для проверки номеров кредитных карт. Мы узнаем о формате чисел и проверках номеров кредитных карт от нескольких поставщиков, таких как VISA, Mastercard, Amex и Diners и т. д.

1. Допустимые форматы номеров кредитных карт

На реальной кредитной карте цифры выдавленного номера карты обычно располагаются группами по четыре. Это делает номер карты более удобным для чтения человеком. Каждая из компаний, выпускающих кредитные карты, использует этот формат номера.

Мы воспользуемся этой разницей в форматах между каждой компанией, чтобы позволить пользователям вводить номер, не указывая компанию. Компанию можно определить по номеру. Формат для каждой компании:

  • Виза: 13 или 16 цифр, начиная с 4.
  • MasterCard: 16 цифр, начиная с 51 по 55.
  • Откройте для себя: 16 цифр, начиная с 6011 или 65.
  • American Express: 15 цифр, начиная с 34 или 37.
  • Diners Club: 14 цифр, начиная с 300 до 305, 36 или 38.
  • JCB: 15 цифр, начиная с 2131 или 1800, или 16 цифр, начиная с 35.

Приведенное ниже регулярное выражение предполагает, что перед выполнением проверки на допустимость числа мы явно выполним поиск и замену всех пробелов и дефисов.

После удаления пробелов и дефисов из входных данных следующее регулярное выражение проверяет, использует ли номер кредитной карты формат какой-либо из шести основных компаний, выпускающих кредитные карты. Оно использует именованный захват для определения марки кредитной карты клиента.

Если вам не нужно определять тип карты, вы можете удалить шесть групп захвата, которые окружают узор для каждого типа карты, поскольку они не служат никакой другой цели.

Если вы принимаете только определенные марки кредитных карт, вы можете удалить карты, которые вы не принимаете, из регулярного выражения. Например, при удалении JCB обязательно удалите последний оставшийся «|» в регулярном выражении. Если в вашем регулярном выражении останется «|», оно также примет пустую строку как допустимый номер карты.

 Регулярное выражение: ^(?:(?<visa>4[0-9]{12}(?:[0-9]{3})?)|(?<mastercard>5[1-5][0-9]{14})|(?<открыть>6(?:011|5[0-9]{2})[0-9]{12})|(?<amex>3[47][0-9]{13})|(?<обедающие>3(?:0[0-5]|[68][0-9])?[0-9]{11})|(?<jcb>(?:2131|1800|35[0-9]{3})[0-9]{11}))$

Подробнее о форматах номеров кредитных карт читайте на этой вики-странице.

2. Пример проверки номера кредитной карты

public static void main(String[] args){List<String> cards = new ArrayList<String>();//Valid Credit Cardscards.add("xxxx-xxxx-xxxx-xxxx"); //Masked to avoid any inconvenience unknowingly//Invalid Credit Cardcards.add("xxxx-xxxx-xxxx-xxxx"); //Masked to avoid any inconvenience unknowinglyString regex = "^(?:(?<visa>4[0-9]{12}(?:[0-9]{3})?)|" +"(?<mastercard>5[1-5][0-9]{14})|" +"(?<discover>6(?:011|5[0-9]{2})[0-9]{12})|" +"(?<amex>3[47][0-9]{13})|" +"(?<diners>3(?:0[0-5]|[68][0-9])?[0-9]{11})|" +"(?<jcb>(?:2131|1800|35[0-9]{3})[0-9]{11}))$";Pattern pattern = Pattern.compile(regex);for(String card : cards){//Strip all hyphenscard = card.replaceAll("-", "");//Match the cardMatcher matcher = pattern.matcher(card);System.out.println(matcher.matches());if(matcher.matches()) {//If card is valid then verify which group it belongSystem.out.println(matcher.group("mastercard"));}}

3. Проверка контрольной суммы с помощью алгоритма Луна

Существует дополнительная проверка, которую вы можете выполнить для номера кредитной карты перед обработкой заказа. Последняя цифра в номере кредитной карты — это контрольная сумма, рассчитанная по алгоритму Луна. Поскольку этот алгоритм требует базовой арифметики, вы не можете реализовать его с помощью регулярного выражения.

Ниже приведен метод, который можно использовать для проверки контрольной суммы с использованием алгоритма Луна. Эта функция принимает строку с номером кредитной карты в качестве параметра. Номер карты должен состоять только из цифр.

Фактический алгоритм работает на массиве цифр, вычисляя контрольную сумму. Если модуль суммы 10 равен нулю, то номер карты действителен. Если нет, то номер недействителен.

Я взял эталонную реализацию алгоритма Луна из Google Code.

public class Luhn{public static boolean Check(String ccNumber){int sum = 0;boolean alternate = false;for(int i = ccNumber.length() - 1; i >= 0; i--){int n = Integer.parseInt(ccNumber.substring(i, i + 1));if(alternate){n *= 2;if(n > 9){n =(n % 10) + 1;}}sum += n;alternate = !alternate;}return(sum % 10 == 0);}}

При необходимости вы можете свободно изменять приведенные выше примеры кода, чтобы они соответствовали другим правилам проверки в приведенном выше регулярном выражении.

Прокрутить вверх