1

我们目前有内容合规性,通过我们监控任何包含信用卡号且没有空格的内容(例如5100080000000000

我们需要的是让一个正则表达式提取每 4 位空格输入的信用卡号(例如:5100 0800 0000 0000

我们一直在寻找替代的 reg exs,但还没有找到适用于上述两种情况的。

我们使用的当前 reg ex 如下

^((4\d{3})|(5[1-5]\d{2})|(6011)|(34\d{1})|(37\d{1}))-?\ d{4}-?\d{4}-?\d{4}|3[4,7][\d\s-]{15}$

4

5 回答 5

2

只需/s?在您已经有可选的地方添加可选-?

所以你的正则表达式变成

^((4\d{3})|(5[1-5]\d{2})|(6011)|(34\d{1})|(37\d{1}))-?\s?\d{4}-?\s?\d{4}-?\s?\d{4}|3[4,7][\d\s-]{15}$
于 2013-05-15T16:07:44.197 回答
1

一旦有人使用美国运通卡并在任何一个“块”中输入 3 或 5 个数字而不是 4

于 2013-05-16T18:56:45.073 回答
1

似乎您已经接受了每四个字符的破折号。因此,您可以简单地替换-?[- ]?到处。

如果您要求破折号或空格保持一致 - 也就是说,根本不允许分组,或者每四个字符一个破折号,或者每四个字符一个空格,您可以使用反向引用来强制重复与第一个相同匹配:

^(?:4\d{3}|5[1-5]\d{2}|6011|3[47]\d{2})([- ]?)\d{4}\1\d{4}\1\d{4}$

你会注意到我删除了3[4,7]...看起来像是错误添加的最终结果,显然是在尝试部分解决这个问题时做出的。此外,我将括号更改为非分组括号,(?:...)或者在没有分组似乎必要或有用的地方简单地删除它们,主要是因为这样可以更容易地查看反向引用\1所指的内容。最后,34.. 和 37.. 模式\d{1}显然\d{2}是有意的(或者如果这些特定系列在第一个破折号之前只有三位数字,那么重复{1}只是多余的,但那3[4,7]...部分会更加错误!)

于 2013-05-15T16:04:52.807 回答
0
((\d+) *(\d+) *(\d+) *(\d+))

这将是一般的想法(它甚至可以工作!),如果你愿意,你可以完善它。有一个很棒的页面可以实时测试您的正则表达式 - http://rubular.com/

于 2013-05-15T15:46:40.453 回答
0

尝试这个:

(\d{4} *\d{4} *\d{4} *\d{4})
于 2013-05-15T16:06:16.737 回答