1
2
我正准备在regular-expressions.info上发布相同的链接,以验证曲目的cc-number部分。 现在,棘手的部分来了。磁道数据在发卡机构和读卡器之间的格式不同。例如,“分隔符”字符并不总是相同的。同样适用于“哨兵”结尾。 维基百科提供了一个很好的概述: http://en.wikipedia.org/wiki/Magnetic_stripe_card 对于track2,卡号后面跟着一个“=”(有时是一个“d”)。那么你的有效期是月日。之后,track2有“任意数据”,可以是任何数据。 过了这一步,我不会担心太多。如果这是跟踪数据,你现在肯定会知道的。我想这取决于你打算用这些数据做什么。 无论如何,对于track2,您可以做得比添加[=d][0-9]4而不是在cc regex末尾添加$糟糕得多:
对于track1,您可以做类似的事情…track1包含更多的变量数据,所以触摸屏可能更复杂。 祝你好运! |
2
9
这里有一个regex,我可以选择轨道1和轨道2。将此选项与regex选项“dot does not match newline”一起使用。
我用这些数据进行了测试(我的读卡器按照这个顺序读取一个磁道1和二个磁道记录,对于我测试的同一张卡,下面更改了编号和名称。)
上面的regex使用命名的捕获组(“?”从每个(组)开始,我看到结果(与regexbuddy一起)如下:
注:第二个匹配项不标识轨道2(匹配项2)中的fc(格式代码)和nm(名称),因为它们不用于轨道2。 如果regex引擎不支持命名组,只需杀死“?”每个捕获组的一部分。然后,使用位置来确定每个组。 另外,我的单次刷卡同时包含磁道1和磁道2(依次是磁道1、CRLF,然后是磁道2)。根据原始问题中的维基百科链接,卡片最多可以有3个轨迹,读者可以同时阅读轨迹1和2(或其中一个或另一个),很少阅读轨迹3。 出于这个原因,我认为使用一个同时查找轨道1和轨道2的regex是一个安全的赌注,如果两者都得到,您可以忽略轨道2(因为轨道1有更多的数据)或您希望的任何内容。 因为这两个磁道都存在于我的刷卡中,所以regex引擎将返回2个与上面的regex匹配的结果(假设读卡器和支持这两个磁道的读卡器没有读取错误)。在我的例子中,这并不困扰我,我只打算使用“第一场比赛”而忽略第二场比赛。 如果您只对轨道1感兴趣,请使用以下regex:
如果您只对轨道2感兴趣,请使用regex:
但我认为检查这两个方面并没有什么坏处,然后使用您得到的第一个,或者可能将跟踪1与跟踪2进行比较,作为一个额外的错误检查步骤。 很抱歉回答您的问题! |
3
2
以下两个正则表达式似乎验证了跟踪1和跟踪2数据。请注意,这些正则表达式假设所使用的字符是上述维基百科信息中“一般”使用的字符。
假设这个百分比?是前哨字符,^用作字段分隔符。还假定帐号、日期和服务代码是数字。
假设;并且?是前哨字符,即字段分隔符。还假定帐号、日期和服务代码是数字。 我使用从magtek读卡器读取的跟踪数据测试了这些表达式。以下两组跟踪数据与从读卡器中读取的数据相匹配,并根据上面的两个正则表达式进行验证(数字显然已更改):
|
4
1
轨道1,格式B翻译为
对什么构成有效字符有一些假设。 当然,没有检查数据是否真正有意义,并且LRC(如果存在)也不能被验证。 你能对照一些真实的数据检查一下这个吗? 轨道2翻译为
|
5
0
注意:track1中的帐号可以包含美国运通卡的空格。 所以:
|
John Rix · 确定Braintree的信用卡/借记卡原产国? 9 年前 |
user3323654 · Luhn公式在Java中的实现 9 年前 |
sarkon · Luhn算法的重构Ruby代码 9 年前 |
user3088441 · 自定义海外支付网关 10 年前 |
deek · 我的PHP信用卡表单无法识别某些输入和错误 11 年前 |