我通读了类似的 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"
(不是真实数据)
现在,查看 wiki 中的跟踪数据信息,我想涵盖大多数情况,如果不是全部的话:
https://en.wikipedia.org/wiki/Magnetic_stripe_card#Financial_cards
可以对我的正则表达式有所帮助。这就是我所拥有的:
/[(%[bB])(;)]\d{3,}.{9,}[(^.+^)(=)].+\?.{,2}
/
曲目 1,格式 B:
开始哨兵——一个字符(通常是'%')
Format code="B" — 一个字符(仅限字母)
主帐号 (PAN) — 最多 19 个字符。通常,但并非总是如此,与印在卡正面的信用卡号相匹配。
字段分隔符- 一个字符(通常为 '^')
名称- 2 到 26 个字符
字段分隔符- 一个字符(通常为 '^')
到期日期— YYMM 格式的四个字符。
服务代码——三个字符
任意数据— 可能包括密码验证密钥指示符(PVKI,1 个字符)、密码验证值(PVV,4 个字符)、卡验证值或卡验证码(CVV 或 CVC,3 个字符)
End sentinel - 一个字符(通常是“?”)
纵向冗余校验 (LRC) — 它是一个字符和一个有效字符,由轨道上的其他数据计算得出。
Track 2:这种格式是由银行业 (ABA) 开发的。该磁道采用 5 位方案(4 个数据位 + 1 个奇偶校验位)写入,它允许 16 个可能的字符,即数字 0-9,加上六个字符:< = > ? . 六个标点符号的选择可能看起来很奇怪,但实际上这十六个代码只是映射到 ASCII 范围 0x30 到 0x3f,它定义了十位数字字符加上这六个符号。数据格式如下:
开始哨兵——一个字符(通常是';')
主帐号 (PAN) — 最多 19 个字符。通常,但并非总是如此,与印在卡正面的信用卡号相匹配。
分隔符- 一个字符(通常为 '=')
到期日期— YYMM 格式的四个字符。
服务代码— 三位数。第一位指定交换规则,第二位指定授权处理,第三位指定服务范围
自由裁量数据——如第一轨
End sentinel - 一个字符(通常是“?”)
纵向冗余校验 (LRC) — 它是一个字符和一个有效字符,由轨道上的其他数据计算得出。大多数读卡器设备在刷卡到表示层时不会返回此值,并且仅使用它来验证读卡器内部的输入。