0

我通读了类似的 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) — 它是一个字符和一个有效字符,由轨道上的其他数据计算得出。大多数读卡器设备在刷卡到表示层时不会返回此值,并且仅使用它来验证读卡器内部的输入。

4

1 回答 1

1
  1. 您的示例输入字符串在第一个标记之后不包含格式代码。
  2. 您正在尝试解析 html 编码的版本,这很奇怪。

所以,我将从 html 解码开始。例如Nokogiri

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

好的,现在我们至少有一个领先的百分比。现在让我们问自己:有多少用户的客人姓名以百分号开头?我打赌没有。您可以通过对数据库运行查询来重新检查自己。由于这是一个临时解决方案,我肯定会关闭完美主义并使用:

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

希望能帮助到你。

于 2015-09-02T14:05:38.687 回答