我有一些数据,我只想从中提取卡的详细信息,即卡号、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
答案 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
一个词边界