首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >信用卡跟踪数据的正则表达式

信用卡跟踪数据的正则表达式
EN

Stack Overflow用户
提问于 2010-03-29 20:02:27
回答 5查看 25.9K关注 0票数 13

是否有任何已知的正则表达式来验证信用卡轨道1和轨道2的数据?

编辑:

来自维基百科

关于金融卡的第1轨的信息有几种格式: A,保留给发卡机构B的专有用途,下文描述;C,保留给ANSI小组委员会X3B10和N使用,可供个别发卡者使用:

轨道1,格式B:

  • 开始哨兵-一个字符(一般'%')
  • 格式code="B“-一个字符(仅阿尔法)
  • 主帐号(PAN) -多达19个字符。通常,但不总是,匹配信用卡号码打印在卡的正面。
  • 字段分隔符-一个字符(通常是'^')
  • 名称-2至26个字符
  • 字段分隔符-一个字符(通常是'^')
  • 过期日期- YYMM表单中的四个字符。
  • 服务代码-三个字符
  • 任意数据-可以包括Pin验证密钥指示器(PVKI,1字符)、PIN验证值(PVV,4个字符)、卡片验证值或卡片验证代码(CVV或CVK,3个字符)。
  • 结束哨兵-一个字符(一般是'?')
  • 纵向冗余校验(LRC) -它是从轨道上的其他数据中计算出来的一个字符和一个有效性字符。应该注意的是,大多数读取器设备在刷卡到表示层时不返回此值,并且只使用它来验证读取器内部的输入。

曲目2:这种格式是由银行业开发的。此跟踪是用5位方案编写的(4个数据位+1个奇偶),允许16个可能的字符,即数字0-9,加上6个字符:;<=>?选择6个标点符号似乎有些奇怪,但实际上,这16个代码只是映射到ASCII范围0x30到0x3f,它定义了十个数字字符加上这六个符号。数据格式如下:

  • 开始哨兵-一个字符(一般是';')
  • 主帐号(PAN) -多达19个字符。通常,但不总是,匹配信用卡号码打印在卡的正面。
  • 分隔符-一个字符(一般为'=')
  • 过期日期- YYMM表单中的四个字符。
  • 服务代码-三个字符
  • 自由裁量数据-如第一轨道中的数据
  • 结束哨兵-一个字符(一般是'?')
  • 纵向冗余校验(LRC) -它是从轨道上的其他数据中计算出来的一个字符和一个有效性字符。应该注意的是,大多数读取器设备在刷卡到表示层时不返回此值,并且只使用它来验证读取器内部的输入。
EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2010-03-29 20:27:12

我正要在正则表达式. link上发布相同的链接,以验证跑道的cc编号部分。

现在,棘手的部分来了。不同发卡者甚至读卡器之间的跟踪数据在格式上有所不同。例如,“分隔符”字符并不总是相同的。最后的“哨兵”也是如此。

维基百科给出了一个很好的概述:卡片

在track2中,卡号后面跟着'=‘(有时是'D')。那么你就有了MMDD的到期日。在那之后,Track2拥有“任意数据”,这可能是任何东西。

在这之后我不会太担心。如果是跟踪数据,你现在已经很确定了。我想这取决于你打算用这些数据做什么。

无论如何,对于Track2来说,比在cc正则表达式末尾添加=D{4}而不是$更糟糕:

代码语言:javascript
运行
复制
^(?: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包含更多的可变数据,因此可能会比较复杂。

祝好运!

票数 2
EN

Stack Overflow用户

发布于 2013-11-19 21:06:25

这是一个REGEX,我可以同时选择第1和第2轨道。使用这与regex选项"Dot不匹配换行符“。

代码语言:javascript
运行
复制
^%(?<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轨的记录,与我测试的同一张卡相同--数字和名称在下面更改)。

代码语言:javascript
运行
复制
%B5581123456781323^SMITH/JOHN^16071021473810559010203?
;5581123456781323=160710212423468?

上述REGEX使用命名捕获组( "?“)从每个(组)开始,我看到结果(使用RegexBuddy)为:

代码语言:javascript
运行
复制
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轨道感兴趣,请使用以下正则表达式:

代码语言:javascript
运行
复制
^%(?<FC>.)(?<PAN>[\d]{1,19}+)\^(?<NM>.{2,26})\^(?<ED>[\d]{0,4}|\^)(?<SC>[\d]{0,3}|\^)(?<DD>.*)\?\Z

如果您只对轨道2感兴趣,请使用regex:

代码语言:javascript
运行
复制
^;(?<PAN>[\d]{1,19}+)=(?<ED>[\d]{0,4}|=)(?<SC>[\d]{0,3}|=)(?<DD>.*)\?\Z

但是,我认为这两种检查都没有坏处,然后使用您得到的第一条,或者可能将轨道1与轨道2比较,作为额外的错误检查步骤。

很抱歉回答那些似乎被回答的问题!

票数 11
EN

Stack Overflow用户

发布于 2010-03-30 13:48:54

以下两个正则表达式似乎验证了轨道1和轨道2的数据。请注意,这些正则表达式假设使用的字符是上面维基百科信息中“一般”使用的字符。

代码语言:javascript
运行
复制
Track 1:  ^%B\d{0,19}\^[\w\s\/]{2,26}\^\d{7}\w*\?$

假设是%然后呢?是前哨字符,该^用作字段分隔符。还假定帐号、日期和服务代码是数字。

代码语言:javascript
运行
复制
Track 2:  ;\d{0,19}=\d{7}\w*\?

假设是这样,然后呢?是前哨字符,这个=是字段分隔符。还假定帐号、日期和服务代码是数字。

我使用从MagTek读卡器读取的跟踪数据测试了这些表达式。以下两组跟踪数据匹配从读取器读取的内容,并根据上面的两个正则表达式进行验证(数字显然已经更改):

代码语言:javascript
运行
复制
%B1234567891234567^SMITH/JOHN                ^15024041234567891234?
;1234567891234567=152024041234567891234?
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2540865

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档