是否有任何已知的正则表达式来验证信用卡轨道1和轨道2的数据?
编辑:
来自维基百科
关于金融卡的第1轨的信息有几种格式: A,保留给发卡机构B的专有用途,下文描述;C,保留给ANSI小组委员会X3B10和N使用,可供个别发卡者使用:
轨道1,格式B:
曲目2:这种格式是由银行业开发的。此跟踪是用5位方案编写的(4个数据位+1个奇偶),允许16个可能的字符,即数字0-9,加上6个字符:;<=>?选择6个标点符号似乎有些奇怪,但实际上,这16个代码只是映射到ASCII范围0x30到0x3f,它定义了十个数字字符加上这六个符号。数据格式如下:
发布于 2010-03-29 20:27:12
我正要在正则表达式. link上发布相同的链接,以验证跑道的cc编号部分。
现在,棘手的部分来了。不同发卡者甚至读卡器之间的跟踪数据在格式上有所不同。例如,“分隔符”字符并不总是相同的。最后的“哨兵”也是如此。
维基百科给出了一个很好的概述:卡片
在track2中,卡号后面跟着'=‘(有时是'D')。那么你就有了MMDD的到期日。在那之后,Track2拥有“任意数据”,这可能是任何东西。
在这之后我不会太担心。如果是跟踪数据,你现在已经很确定了。我想这取决于你打算用这些数据做什么。
无论如何,对于Track2来说,比在cc正则表达式末尾添加=D{4}而不是$更糟糕:
^(?:4[0-9]{12}(?:[0-9]{3})?|5[1-5][0-9]{14}|6(?:011|5[0-9][0-9])[0-9]{12}|3[47][0-9]{13}|3(?:0[0-5]|[68][0-9])[0-9]{11}|(?:2131|1800|35\d{3})\d{11})[=D][0-9]{4}
对于track1来说,你可以做一些类似的事情.Track1包含更多的可变数据,因此可能会比较复杂。
祝好运!
发布于 2013-11-19 21:06:25
这是一个REGEX,我可以同时选择第1和第2轨道。使用这与regex选项"Dot不匹配换行符“。
^%(?<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使用命名捕获组( "?“)从每个(组)开始,我看到结果(使用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
注意,第二次匹配没有识别轨道2 (匹配2)中的FC (格式代码)和NM (名称),因为它们不在轨道2中使用。
如果regex引擎不支持命名组,只需杀死"?“每个捕获组的一部分。然后,使用位置来确定每一组。
此外,我的单次滑动包括轨道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感兴趣,请使用regex:
^;(?<PAN>[\d]{1,19}+)=(?<ED>[\d]{0,4}|=)(?<SC>[\d]{0,3}|=)(?<DD>.*)\?\Z
但是,我认为这两种检查都没有坏处,然后使用您得到的第一条,或者可能将轨道1与轨道2比较,作为额外的错误检查步骤。
很抱歉回答那些似乎被回答的问题!
发布于 2010-03-30 13:48:54
以下两个正则表达式似乎验证了轨道1和轨道2的数据。请注意,这些正则表达式假设使用的字符是上面维基百科信息中“一般”使用的字符。
Track 1: ^%B\d{0,19}\^[\w\s\/]{2,26}\^\d{7}\w*\?$
假设是%然后呢?是前哨字符,该^用作字段分隔符。还假定帐号、日期和服务代码是数字。
Track 2: ;\d{0,19}=\d{7}\w*\?
假设是这样,然后呢?是前哨字符,这个=是字段分隔符。还假定帐号、日期和服务代码是数字。
我使用从MagTek读卡器读取的跟踪数据测试了这些表达式。以下两组跟踪数据匹配从读取器读取的内容,并根据上面的两个正则表达式进行验证(数字显然已经更改):
%B1234567891234567^SMITH/JOHN ^15024041234567891234?
;1234567891234567=152024041234567891234?
https://stackoverflow.com/questions/2540865
复制相似问题