Подтвердить что ты не робот

Регулярное выражение для данных кредитной карты

Существуют ли какие-либо известные регулярные выражения для проверки данных 1 и 2 дорожки кредитных карт?

EDIT:

От Wikipedia:

Информация на треке 1 по финансовым картам содержится в нескольких форматах: A, который зарезервирован для частного использования эмитентом карты, B, который описан ниже, CM, который зарезервирован для использования подкомитетом ANSI X3B10 и NZ, которые доступны для использования отдельными эмитентами карт:

Трек 1, Формат B:

  • Начать дозор - один символ (обычно "%" )
  • Формат кода = "B" - один символ (только альфа)
  • Основной номер учетной записи (PAN) - до 19 символов. Обычно, но не всегда, соответствует номер кредитной карты, напечатанный на лицевой стороне карты.
  • Полевой разделитель - один символ (обычно '^')
  • Имя - от двух до 26 символов
  • Полевой разделитель - один символ (обычно '^')
  • Дата истечения срока действия - четыре символа в форме YYMM.
  • Сервисный код - три символа
  • Дискреционные данные - могут включать индикатор ключа проверки PIN-кода (PVKI, 1 символ), значение подтверждения PIN-кода (PVV, 4 символа), значение подтверждения карты или код подтверждения карты (CVV или CVK, 3 символа).
  • Конечный дозор - один символ (обычно '?')
  • Проверка продольной избыточности (LRC) - это один символ и символ достоверности, рассчитанный по другим данным на дорожке. Следует отметить, что большинство считывающих устройств не возвращают это значение, когда карта переводится на уровень представления и использует его только для проверки ввода внутри устройства.

Трек 2. Этот формат был разработан банковской отраслью (ABA). Этот трек записывается с 5-битной схемой (4 бита данных + 1 четность), что позволяет использовать шестнадцать возможных символов, которые являются номерами 0-9, плюс шесть символов:; <= > ?, Выбор шести символов пунктуации может показаться странным, но на самом деле шестнадцать кодов просто сопоставляются с диапазоном ASCII от 0x30 до 0x3f, который определяет десятизначные символы плюс эти шесть символов. Формат данных выглядит следующим образом:

  • Начать дозор - один символ (обычно ';')
  • Основной номер учетной записи (PAN) - до 19 символов. Обычно, но не всегда, соответствует номер кредитной карты, напечатанный на лицевой стороне карты.
  • Сепаратор - один char (обычно '=')
  • Дата истечения срока действия - четыре символа в форме YYMM.
  • Сервисный код - три символа
  • Дискреционные данные - как в первой дорожке
  • Конечный дозор - один символ (обычно '?')
  • Проверка продольной избыточности (LRC) - это один символ и символ достоверности, рассчитанный по другим данным на дорожке. Следует отметить, что большинство считывающих устройств не возвращают это значение, когда карта переводится на уровень представления и использует его только для проверки ввода внутри устройства.
4b9b3361

Ответ 1

Я собирался опубликовать ту же ссылку на regular-expressions.info, чтобы проверить номер cc number на дорожке.

Теперь идет сложная часть. Данные треков различаются в разных форматах между эмитентами карт и даже считывателями карт. Например, символы "разделитель" не всегда одинаковы. То же самое относится к концу "часовых".

Википедия дает хороший обзор: http://en.wikipedia.org/wiki/Magnetic_stripe_card

С треком2 за номером карты следует символ '=' (или иногда 'D'). Затем у вас есть срок годности как MMDD. После этого Track2 имеет "дискреционные данные", что может быть чем угодно.

Я не стал бы слишком переживать после этого момента. Если он отслеживает данные, к настоящему времени вы будете вполне уверены. Я думаю, это зависит от того, что вы пытаетесь сделать с данными.

В любом случае для Track2 вы можете сделать намного хуже, чем добавлять [= D] [0-9] {4} вместо $в конце регулярного выражения cc:

^(?:4[0-9]{12}(?:[0-9]{3})?|5[1-5][0-9]{14}|6(?:011|5[0-9][0-9])[0-9]{12}|3[47][0-9]{13}|3(?:0[0-5]|[68][0-9])[0-9]{11}|(?:2131|1800|35\d{3})\d{11})[=D][0-9]{4}

Для трека 1 вы можете сделать что-то подобное... Track1 содержит больше переменных данных, поэтому может быть сложнее прикосновение.

Удачи!

Ответ 2

Вот REGEX, который работает для меня, чтобы выбрать как Track 1, так и Track 2. Используйте это с опцией регулярного выражения "Dot не соответствует новой строке".

^%(?<FC>.)(?<PAN>[\d]{1,19}+)\^(?<NM>.{2,26})\^(?<ED>[\d]{0,4}|\^)(?<SC>[\d]{0,3}|\^)(?<DD>.*)\?|;(?<PAN>[\d]{1,19}+)=(?<ED>[\d]{0,4}|=)(?<SC>[\d]{0,3}|=)(?<DD>.*)\?\Z

Я тестировал эти данные (мой читатель читает как запись трека 1, так и трек 2 в этом порядке для той же самой карты, на которую я тестировал - числа и имя, измененные ниже).

%B5581123456781323^SMITH/JOHN^16071021473810559010203?
;5581123456781323=160710212423468?

Вышеупомянутый REGEX использует NAMED CAPTURE GROUPS ( "?", который начинается каждый (группа)), и я вижу результат (с RegexBuddy) как:

Match 1:    %B5581123456781323^SMITH/JOHN^16071021473810559010203?       0      54
Group "FC": B        1       1
Group "PAN":    5581123456781323         2      16
Group "NM": SMITH/JOHN      19      10
Group "ED": 1607        30       4
Group "SC": 102     34       3
Group "DD": 1473810559010203        37      16

Match 2:    ;5581123456781323=160710212423468?      56      34
Group "FC" did not participate in the match
Group "PAN":    5581123456781323        57      16
Group "NM" did not participate in the match
Group "ED": 1607        74       4
Group "SC": 102     78       3
Group "DD": 12423468        81       8

Обратите внимание, что второе совпадение НЕ идентифицирует FC (формат кода) и NM (имя) в треке 2 (совпадение 2), поскольку они не используются в треке 2.

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

Кроме того, мой единственный SWIPE содержит BOTH трек 1 и трек 2 (в этом порядке, трек 1, crlf, а затем трек 2). Согласно ссылке Википедии в исходном вопросе, карты могут иметь до 3 дорожек, и читатели могут читать дорожки 1 и 2 как (или один или другой), так и редко трек 3.

По этой причине я считаю безопасным использовать REGEX, который ищет как трек 1, так и трек 2, и если вы получите оба, вы можете проигнорировать трек 2 (поскольку трек 1 имеет больше данных) или что угодно.

Поскольку оба трека присутствуют в моих промах, двигатель REGEX вернет 2 совпадения с моим REGEX выше (если не считать ошибки чтения от читателя и считывателя, который поддерживает оба трека). В моем случае это меня не беспокоит, и я просто планирую использовать "первое совпадение" и игнорировать второй.

Если вам интересно только в треке 1, используйте это регулярное выражение:

^%(?<FC>.)(?<PAN>[\d]{1,19}+)\^(?<NM>.{2,26})\^(?<ED>[\d]{0,4}|\^)(?<SC>[\d]{0,3}|\^)(?<DD>.*)\?\Z

Если вас интересует только трек 2, используйте регулярное выражение:

^;(?<PAN>[\d]{1,19}+)=(?<ED>[\d]{0,4}|=)(?<SC>[\d]{0,3}|=)(?<DD>.*)\?\Z

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

Извините, что ответили на ваш ответ!

Ответ 3

Следующие два регулярных выражения, похоже, подтверждают данные дорожки 1 и дорожки 2. Обратите внимание, что эти регулярные выражения делают предположения, что используемые символы являются теми, которые "обычно" используются в информации Википедии выше.

Track 1:  ^%B\d{0,19}\^[\w\s\/]{2,26}\^\d{7}\w*\?$

Предполагается, что% и? являются часовыми символами и что ^ используется как символ разделителя полей. Также предполагается, что номер учетной записи, дата и код обслуживания являются цифрами.

Track 2:  ;\d{0,19}=\d{7}\w*\?

Предполагается, что; а также? являются часовыми символами, а = - разделителем полей. Также предполагается, что номер учетной записи, дата и код обслуживания являются цифрами.

Я тестировал эти выражения, используя данные треков, считанные с устройства чтения карт MagTek. Следующие два набора данных дорожки соответствуют тому, что было прочитано от читателя, и проверяют два вышеперечисленных выражения (числа, очевидно, были изменены):

%B1234567891234567^SMITH/JOHN                ^15024041234567891234?
;1234567891234567=152024041234567891234?

Ответ 4

Трек 1, формат B переводит на

^%B[^\^\W]{0,19}\^[^\^]{2,26}\^\d{4}\w{3}[^?]+\?\w?$

с некоторыми предположениями относительно того, что представляет собой действительный символ.

Конечно, нет никаких проверок, действительно ли данные действительно значимы, и LRC (если присутствует) также не может быть проверен.

Можете ли вы проверить это на некоторые реальные данные и посмотреть, работает ли он?

Трек 2 переводит на

;[^=]{0,19}=\d{4}\w{3}[^?]+\?\w?

Ответ 5

Примечание. Номер учетной записи в треке 1 может содержать пробелы для карт American Express. Итак:

^%(?.)(?[\d\s]{1,19}+)\^(?.{2,26})\^(?[\d]{0,4}|\^)(?[\d]{0,3}|\^)(?.*)\?|;(?[\d]{1,19}+)=(?[\d]{0,4}|=)(?[\d]{0,3}|=)(?.*)\?\Z