Вот REGEX, который помогает мне выбрать дорожку 1 и дорожку 2. Используйте это с опцией регулярного выражения "Точка НЕ соответствует символу новой строки".
^%(?<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 GRUPS («?», Который начинается с каждой (группы)), и я вижу результат (с 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 содержит ОБА дорожку 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 в качестве дополнительного шага проверки ошибок.
Извините, что отвечаю на то, что кажется ответом!