ruby / rails обнаруживает данные финансового трека и возвращает ноль / пустую строку

Я прочитал похожие вопросы stackoverflow, чтобы понять данные финансовых карт.

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

Теперь у нас есть сервис, который случайно возвращает данные трека вместо имени гостя.

Моя цель - каждый раз, когда я получаю данные трека, я показываю "" пустую строку, иначе возвращаю имя гостя. (Это временное решение, пока мы не исправим основную причину)

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

irb(main):043:0> guestname="%4234242xx12^TEST/GUEST L      ^324532635645744646462"

irb(main):044:0> (/[(%[bB])(;)]\d{3,}.{9,}[(^.+^)(=)].+\?.{,2}/.match(guestname)) ? "" : guestname
=> "%4234242xx12^TEST/GUEST L      ^324532635645744646462"

(Не настоящие данные)

Теперь, глядя на вики для информации о треках, я хочу охватить большинство, если не все, случаев:

https://en.wikipedia.org/wiki/Mintage_stripe_card#Financial_cards

Не могли бы помочь с моим регулярным выражением. Вот что у меня есть:

/[(%[bB])(;)]\d{3,}.{9,}[(^.+^)(=)].+\?.{,2}/

Дорожка 1, формат B:

Старт дозорного - один символ (обычно "%")

Код формата = "B" - один символ (только альфа)

Номер основного счета (PAN) - до 19 символов. Обычно, но не всегда, совпадает с номером кредитной карты, напечатанным на лицевой стороне карты.

Разделитель полей - один символ (обычно "^").

Имя - от 2 до 26 символов.

Разделитель полей - один символ (обычно "^").

Срок годности - четыре символа в формате ГГММ.

Сервисный код - три символа

Дискреционные данные - могут включать индикатор ключа проверки PIN-кода (PVKI, 1 символ), значение проверки PIN (PVV, 4 символа), значение проверки карты или код проверки карты (CVV или CVC, 3 символа).

Конец дозорного - один символ (обычно "?")

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

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

Старт дозорного - один символ (обычно ";")

Номер основного счета (PAN) - до 19 символов. Обычно, но не всегда, совпадает с номером кредитной карты, напечатанным на лицевой стороне карты.

Разделитель - один символ (обычно '=')

Срок годности - четыре символа в формате ГГММ.

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

Дискреционные данные - как в первом треке.

Конец дозорного - один символ (обычно "?")

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


person Micheal    schedule 02.09.2015    source источник


Ответы (1)


  1. Строка ввода вашего примера не содержит кода формата после первого дозорного.
  2. Вы пытаетесь разобрать версию в кодировке html, что странно.

Итак, я бы начал с декодирования html. Например. с помощью Nokogiri:

▶ guestname="%4234242xx12^TEST/GUEST L      ^324532635645744646462"
#⇒ "%4234242xx12^TEST/GUEST L      ^324532635645744646462"
▶ parsed = Nokogiri::HTML.parse(guestname).text
#⇒ "%4234242xx12^TEST/GUEST L      ^324532635645744646462"

Хорошо, теперь у нас, по крайней мере, есть опережающий процент. Теперь давайте зададимся вопросом: у скольких пользователей имя гостя начинается со знака процента? Бьюсь об заклад, нет. Вы можете перепроверить себя, выполнив запрос к своей базе данных. Поскольку это временное решение, я бы определенно отказался от перфекционизма и пошел бы с:

▶ parsed =~ /\A%/ ? '' : parsed

Надеюсь, поможет.

person Aleksei Matiushkin    schedule 02.09.2015
comment
Спасибо. Не могли бы вы объяснить, какие имена можно использовать с указанным выше регулярным выражением? - person Micheal; 03.09.2015
comment
Все, что не начинается со знака процента. - person Aleksei Matiushkin; 03.09.2015