正则表达式提取信用卡信息

时间:2021-05-08 09:45:44

标签: regex

我有一些数据,我只想从中提取卡的详细信息,即卡号、Expr 月/年和 Cvv。 我尝试了很多模式,但没有一个对它们都有效。如果一个匹配,那么另一个就不会。

测试数据:

4400634848591837Cvv: 362Expm: 04Expy: 20
4400634848591837:04 20 362
4400634848591837|04/24 362
4400634848591837 0420 362

正则表达式:

(\d{16})[\/\s:|]*?(\d\d)[\/\s|]*?(\d{2,4})[\/\s|-]*?(\d{3})

这与其余的匹配,但我还没有弄清楚如何匹配第一行。我试过 +- Lookahead & Lookbehind 但它从来没有对我有用。所以任何帮助都会很棒。

演示: Here

1 个答案:

答案 0 :(得分:1)

第一行16位后的部分格式不同,取值顺序也不同。

您可以使用包含 3 个组的交替 | 来获取 Cvv 部分的值。

请注意,您不必使用 [\/\s|-]*? 使字符类 ? 非贪婪,因为字符不能交叉匹配后面的数字。

\b(\d{16})(?:[\/\s:|]*(\d\d)[\/\s|]*(\d{2,4})[\/\s|-]*(\d{3})|Cvv:\s*(\d{3})Expm:\s*(\d\d)Expy:\s*(\d\d))\b
  • \b 防止部分匹配的单词边界
  • (\d{16})(?:[\/\s:|]*(\d\d)[\/\s|]*(\d{2,4})[\/\s|-]*(\d{3}) 最后三行的模式
  • |
  • Cvv:\s*(\d{3})Expm:\s*(\d\d)Expy:\s*(\d\d)) 第一行的模式,匹配行中的文本,然后捕获 3 组中的数字
  • \b 一个词边界

Regex demo