DCN*_*YAM 12 regex credit-card
是否有任何已知的正则表达式来验证信用卡轨道1和跟踪2数据?
编辑:
来自维基百科:
金融卡上的第1轨道上的信息包含在几种格式中:A,保留用于发卡机构的专有用途,B,如下所述,CM,保留供ANSI分技术委员会X3B10和NZ使用,它们是可供个别发卡机构使用:
第1轨,格式B:
专题2:此格式由银行业(ABA)开发.该轨道采用5位方案(4个数据位+ 1个奇偶校验)写入,允许16个可能的字符,即0-9,加上6个字符:<=>?.六个标点符号的选择可能看起来很奇怪,但实际上十六个代码只是映射到ASCII范围0x30到0x3f,它定义了十个数字字符加上那六个符号.数据格式如下:
Eri*_*ken 10
这是一个REGEX,我可以选择Track 1和Track 2.使用正则表达式选项"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
Run Code Online (Sandbox Code Playgroud)
我测试了这些数据(我的读者正在按顺序阅读Track 1和Track 2记录,对于我测试的同一张卡 - 下面更改了数字和名称.)
%B5581123456781323^SMITH/JOHN^16071021473810559010203?
;5581123456781323=160710212423468?
Run Code Online (Sandbox Code Playgroud)
以上REGEX使用NAMED CAPTURE GROUPS(每个(组)开始的"?"),我看到结果(使用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
Run Code Online (Sandbox Code Playgroud)
请注意,第二个匹配不识别轨道2(匹配2)中的FC(格式代码)和NM(名称),因为它们未在轨道2中使用.
如果你的正则表达式引擎不支持NAMED GROUPS,那就杀掉"?" 每个捕获组的一部分.然后,使用位置确定每个组.
此外,我的单个SWIPE包含BOTH轨道1和轨道2(按顺序,轨道1,一个crlf,然后是轨道2).根据原始问题中的维基百科链接,卡片最多可以有3个轨道,读者可以读取轨道1和2(或者一个或另一个),很少跟踪3个.
出于这个原因,我认为使用寻找轨道1和轨道2的REGEX是一个安全的赌注,如果你同时获得两者,你可以忽略轨道2(因为轨道1有更多数据)或任何你想要的.
因为我的滑动中存在两个轨道,所以REGEX引擎将返回上面的REGEX的2个匹配(假设读取器和支持两个轨道的读取器没有读取错误).在我的情况下,这不会打扰我,我只是打算使用"第一场比赛"并忽略第二场比赛.
如果您只对第1轨道感兴趣,请使用此正则表达式:
^%(?<FC>.)(?<PAN>[\d]{1,19}+)\^(?<NM>.{2,26})\^(?<ED>[\d]{0,4}|\^)(?<SC>[\d]{0,3}|\^)(?<DD>.*)\?\Z
Run Code Online (Sandbox Code Playgroud)
如果您只对第2轨道感兴趣,请使用正则表达式:
^;(?<PAN>[\d]{1,19}+)=(?<ED>[\d]{0,4}|=)(?<SC>[\d]{0,3}|=)(?<DD>.*)\?\Z
Run Code Online (Sandbox Code Playgroud)
但是我认为检查两者然后使用你得到的第一个,或者可能将轨道1和轨道2作为额外的错误检查步骤进行比较没有坏处.
很抱歉回答似乎回答的问题!
我正准备在regular-expressions.info 上发布相同的链接,用于验证曲目的抄送号码部分。
现在,棘手的部分来了。跟踪数据的格式因发卡机构甚至读卡器而异。例如,“分隔符”字符并不总是相同。这同样适用于最后的“哨兵”。
维基百科给出了很好的概述:http ://en.wikipedia.org/wiki/Magnetic_stripe_card
对于 track2,卡号后跟一个“=”(有时是“D”)。那么您的到期日期为 MMDD。之后,Track2 拥有“任意数据”,可以是任何数据。
过了这一步我就不会太担心了。如果是跟踪数据,您现在就可以确定了。我想这取决于您打算如何处理数据。
无论如何,对于 Track2,您可能会做得比在 cc 正则表达式末尾添加 [=D][0-9]{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}
Run Code Online (Sandbox Code Playgroud)
对于 track1,您可以执行类似的操作...Track1 包含更多可变数据,因此可能会更复杂一些。
祝你好运!