正则表达式信用卡号测试
我正在测试一个应用程序,其中正则表达式模式与信用卡匹配,然后应该突出显示这些数字。我正在使用网站 http://regexpal.com/ 来创建测试信用卡号以进行测试。 测试它时,我没有成功建立这样的号码
我的要求是拥有有效的信用卡号码,其中可以有“-”和/或“,”。当我使用网站http://regexpal.com。
我需要一些信用号码,其场景低于
- 有效的信用卡号码,任何数字之间可以有“-”。
- 有效的信用卡号,任意数字之间可以有“,”。
- 有效的信用卡号,任意数字之间可以包含“,”或“-”的组合。
I'm testing one application where Regex pattern match credit card then such numbers should be highlighted. I'm using site http://regexpal.com/ to create test credit credit card numbers for my testing. my requirement is to have valid credit card numbers which can have "-" and/or "," between them.I was not successful to build such a number as when i test it using the site
I need few credit numbers with scenarios below
- valid credit card number which can have "-" between any digit.
- valid credit card number which can have "," between any digit.
- valid credit card number which can have cobination of "," or "-" between any digit.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(16)
常见信用卡供应商正则表达式:
^3[47][0-9]{13}$
^(6541|6556)[0-9]{12} $
^389[0-9]{11}$
^3(?:0[0-5]|[68][0-9])[0-9]{11}$
^65[4-9][0-9]{13}|64[4-9][0-9]{13}|6011[0-9]{12}|(622(?:12 [6- 9]|1[3-9][0-9]|[2-8][0-9][0-9]|9[01][0-9]|92[0-5])[0 -9]{10})$
^63[7-9][0-9]{13}$
^(?:2131|1800|35\d{3})\d {11}$
^9[0-9]{15}$
^(6304|6706|6709|6771)[0-9]{12,15}$
^(5018|5020|5038|6304|6759|6761|6763) [0-9]{8,15}$
^(6334|6767)[0-9]{12}|(6334|6767)[0-9]{14}|(6334|6767)[0-9]{15}$
^(62[0-9]{14,17})$
^4[0-9]{12}(?:[0-9] {3})?$
^(?:4[0-9]{12}(?:[0-9]{3})?|5[1-5] [0-9]{14})$
Common credit card vendor regular expressions:
^3[47][0-9]{13}$
^(6541|6556)[0-9]{12}$
^389[0-9]{11}$
^3(?:0[0-5]|[68][0-9])[0-9]{11}$
^65[4-9][0-9]{13}|64[4-9][0-9]{13}|6011[0-9]{12}|(622(?:12[6-9]|1[3-9][0-9]|[2-8][0-9][0-9]|9[01][0-9]|92[0-5])[0-9]{10})$
^63[7-9][0-9]{13}$
^(?:2131|1800|35\d{3})\d{11}$
^9[0-9]{15}$
^(6304|6706|6709|6771)[0-9]{12,15}$
^(5018|5020|5038|6304|6759|6761|6763)[0-9]{8,15}$
^(5[1-5][0-9]{14}|2(22[1-9][0-9]{12}|2[3-9][0-9]{13}|[3-6][0-9]{14}|7[0-1][0-9]{13}|720[0-9]{12}))$
^(6334|6767)[0-9]{12}|(6334|6767)[0-9]{14}|(6334|6767)[0-9]{15}$
^(4903|4905|4911|4936|6333|6759)[0-9]{12}|(4903|4905|4911|4936|6333|6759)[0-9]{14}|(4903|4905|4911|4936|6333|6759)[0-9]{15}|564182[0-9]{10}|564182[0-9]{12}|564182[0-9]{13}|633110[0-9]{10}|633110[0-9]{12}|633110[0-9]{13}$
^(62[0-9]{14,17})$
^4[0-9]{12}(?:[0-9]{3})?$
^(?:4[0-9]{12}(?:[0-9]{3})?|5[1-5][0-9]{14})$
首先从字符串中删除所有
、
和-
以及其他非数字。然后使用此正则表达式来匹配 Visa、MasterCard、American Express、Diners Club、Discover 和 JCB 卡:
^(?:4[0-9]{12}(?:[0-9]{3})?|[25][1-7][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})$
Remove all
,
and-
and other non-digits from the string first.Then use this regex that matches Visa, MasterCard, American Express, Diners Club, Discover, and JCB cards:
^(?:4[0-9]{12}(?:[0-9]{3})?|[25][1-7][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})$
2019 年
。不是。使用。 REGEX !!! (带有 3 个感叹号)
从评论中,我必须强调 PeteWiFi 的评论:
如果您想使用正则表达式只是为了了解卡品牌用于视觉用途(例如显示 Visa 徽标或标签),那没问题。但如果你的代码逻辑依赖于它,那么不要使用正则表达式,也不要使用第 3 方插件/库!
正则表达式检测卡号快速且简单简单的。但从长远来看,你的项目将会遇到许多严重的问题。难以解决的错误。发卡机构不断推出新的卡号模式,或者撤回旧的卡号模式,或者可能彻底倒闭。谁知道呢。
解决方案
根据一些经常更新的官方页面构建您自己的解决方案(最好是非正则表达式),例如 此页面维基百科。
至于“-”、“.”、“空格”和所有其他噪音,只需删除所有这些非数字,就可以使用这个(基于此答案):
还不相信?
此页面深入探讨了正则表达式为何如此的深入技术细节地狱。 (请注意,这篇文章使用了“地狱”这个词,因为一旦你进去了,你就无法出去)
编辑
这是我开发的解决方案(在 PHP 中):
2019
DO. NOT. USE. REGEX !!! (with 3 exclamation marks)
From the comments, I must highlight PeteWiFi's comment:
If you want to use regex just to know the card brand for visual use (like displaying Visa logo or label), that is fine. But if your code logic depends on it, then don't use regex, and don't use 3rd party plugin/library!
Regex detecting card numbers is quick & easy. But in the long run, your project will run into many serious & hard-to-solve bugs. Card issuers keep introducing new card number patterns, or withdraw old ones, or may completely close down. Who knows.
Solution
Build your own solution (preferably non-regex) based on some official pages that's frequently updated, like this page on wikipedia.
As for the "-", ".", "space", and all other noise, simply remove all these non-digits, you can use this (Based on this answer):
Not convinced yet?
This page goes into deep technical details why regex is hell. (Notice the artical used the word "hell" because once you're in you can't go out)
EDIT
Here's a solution I developed (in PHP):
接受的答案很好,但为了适应新的万事达卡 BIN,我相信它需要更新为:
^(?:4[0-9]{12}(?:[0-9]{3})?|[25][1-7][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})$
(关键部分是
[25][1-7][0-9]{14}
,因为第一个数字现在可以是 2 或 5,第二个数字最多可以是7)如有错误,请指正!
The accepted answer is great, but to accommodate the new MasterCard BIN, I believe that it would need to be updated to:
^(?:4[0-9]{12}(?:[0-9]{3})?|[25][1-7][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})$
(the critical piece being
[25][1-7][0-9]{14}
, since the first digit can now be either a 2 or a 5 and the second digit can be up to 7)Please correct me if I'm wrong!
对于 Rupay 借记卡:
^6[0-9]{15}$
For Rupay Debit Card:
^6[0-9]{15}$
这是我检测卡网络的方法(2020年更新):
Here is my method for detecting card network (updated 2020):
领先卡网络
万事达卡的正则表达式(2-Bin、5-Bin 均):"(?:5[1-5][0-9]{2}|222[1-9] |22[3-9][0-9]|2[3-6][0-9]{2}|27[01][0-9]|2720)[0-9]{12}"
签证:“^4[0-9]{6,}$”
大莱俱乐部:“(^30[0-5][0-9]{11} $)|(^(36|38)[0-9]{12}$)"
美国运通:"^[34|37][0-9]{14}$"
JCB: "(^3[0-9]{15}$)|(^(2131|1800)[0-9]{11}$)"
发现: "^6011-?\d{ 4}-?\d{4}-?\d{4}$"
Regex for Leading Card Networks
Master Card(2-Bin, 5-Bin both):"(?:5[1-5][0-9]{2}|222[1-9]|22[3-9][0-9]|2[3-6][0-9]{2}|27[01][0-9]|2720)[0-9]{12}"
Visa: "^4[0-9]{6,}$"
Diner's Club: "(^30[0-5][0-9]{11}$)|(^(36|38)[0-9]{12}$)"
American Express: "^[34|37][0-9]{14}$"
JCB: "(^3[0-9]{15}$)|(^(2131|1800)[0-9]{11}$)"
Discover: "^6011-?\d{4}-?\d{4}-?\d{4}$"
除了上述内容之外,这里还有一个新万事达卡的正则表达式,其中包括 2221-2720 BIN:
注意,如果用户开始输入与万事达卡相对应的卡数字,则此正则表达式将匹配。例如,如果用户输入“222185”,则正则表达式将匹配,因为没有其他类型的卡以“2221”开头。如果您想在输入卡的第一个数字时显示卡类型,则此正则表达式可能会派上用场。
或者,如果您想要“事后”匹配,您可以更改
{0,14}
和{0,12}
的最后一部分到{14}
和{12}
:In addition to all above, here's a regex for new MasterCards, that includes 2221-2720 BINs:
Note, this regex will match if user starts typing card digits, that correspond to MasterCard. For example, if user types "222185" then the regex will match, because there is no other type of card that starts with "2221". This regex might come handy if you want to display card type while typing first digits of the card.
Alternatively, if you want "post factum" matching, you can change the last part from
{0,14}
and{0,12}
to{14}
and{12}
:我想出了一个允许使用破折号和空格的正则表达式。在这里测试一下: https://regex101.com/r/Rx2iWD/1
允许逗号(我认为这很不寻常),只需将其添加到
sep
定义中即可。在 PHP 中:
I came up with a regex that allows for dashes and spaces. Test it here: https://regex101.com/r/Rx2iWD/1
To allow commas (which I think is unusual), just add it to the
sep
definition.In PHP:
对于任何尝试使用 Swift (iOS) 执行此操作的人,我构建了一个不使用 RegEx 的小项目,该项目执行 CC 前缀验证、检查数字验证(使用 Luhn 算法)以及其他一些很酷的功能事物。修改添加新的卡类型和号码范围非常简单,无需了解复杂的正则表达式。这与 @evilReiko 在他的回答中所做的类似。
100%免费。完全开源。
https://github.com/ethanwa/credit-card-scanner-and-验证器
For anyone trying to do this with Swift (iOS), I built a little project that doesn't use RegEx that does CC prefix validation, check digit validation (using Luhn algorithm), and a few other cool things. It is very simple to modify to add new card types and number ranges without having to know complex RegEx. It's similar to what @evilReiko does in his answer.
100% free. Full open source.
https://github.com/ethanwa/credit-card-scanner-and-validator
Rupay 卡的 Regx :
(508[5-9][0-9]{12})|(6069[8-9][0-9]{11})|(607[0-8][0-9]{12}) |(6079[0-8][0-9]{11})|(608[0- 5][0-9]{12})|(6521[5-9][0-9]{11})|(652[2-9][0-9]{12})|(6530[0 -9]{12})|(6531[0-4][0-9]{11})
使用bin系列:
508500 – 508999,
606985 – 606999,
607000 - 607899,
607900 - 607984,
608001 -- 608500,
652150 --- 652199,
652200 --- 652999,
653000 --- 653099,
653100 --- 653149,
Regx for Rupay card :
(508[5-9][0-9]{12})|(6069[8-9][0-9]{11})|(607[0-8][0-9]{12})|(6079[0-8][0-9]{11})|(608[0-5][0-9]{12})|(6521[5-9][0-9]{11})|(652[2-9][0-9]{12})|(6530[0-9]{12})|(6531[0-4][0-9]{11})
using bin series :
508500 – 508999,
606985 – 606999,
607000 - 607899,
607900 - 607984,
608001 -- 608500,
652150 --- 652199,
652200 --- 652999,
653000 --- 653099,
653100 --- 653149,
所有卡类型的正则表达式
检查可以在这里
https://regex101.com/r/37S1iV/1
Regex for all card type
Check can here
https://regex101.com/r/37S1iV/1
First Data 验证 Amex 的 15 位数字和 Visa、mc、discover、diners 和 jcb 的 16 位数字,因此我仅在卡号长度为 15 或 16 位时才将卡号发送给他们,使用以下方法:
First Data validates 15 digits for Amex and 16 for visa, mc, discover, diners, and jcb so I only send the card number to them if the number is 15 or 16 digits long using this:
这是
此答案格式为 JavaScript 代码。
Here's
this answer formatted as JavaScript code.
对于评论中要求解决空格分隔值的多个请求,这可以很容易地实现:
For the multiple requests in the comments asking for a solution to whitespace separated values, this can be achieved pretty easily:
javascript中的evilReiko解决方案
evilReiko solution in javascript