雅普。(是的,另一个正则表达式问题)。
除了具体的例子之外,不确定描述这一点的最清晰的方式。
示例文本:
- 4444 4444 4444 4444
- 4444444444444444
- 44 44 44 44 44 44 44 44
- 4444-4444-4444-4444
- 4444(多个空格) 4444(多个空格) 4444(多个空格) 4444
- 0.4444444444444444
- 0.4444 4444 4444 4444
我需要构建一个仅匹配 1、2 和 4 的正则表达式。要求 13-16 位数字,短划线和空格可选,但仅限单个空格,并且总数不超过 3 个。
这显然与 CC 信息搜索有关,我已经进行了大量研究,发现了许多可以找到大多数匹配、全部匹配或没有匹配的示例,但没有任何东西可以消除上述 3 和 5 等过多的误报。我正在使用 PowerGREP 5,我已经阅读了https://www.regular-expressions.info/tutorial.html上的整个教程,但我无法弄清楚如何限制整体匹配中可选空格的数量。即:如果我将空格设为可选,则“1 2 3 4 5 6 7 8 9”与“123 456 789”匹配。本质上,如果检测到超过 3 个空格/破折号,我希望正则表达式结束匹配搜索。
旁注:我在一家处理大量日历数据的公司工作,因此使用许多“1 2 3 4 5 6 7 8 ...”样式的文本字符串获取巨大的驱动器会产生大量错误点击,即使我花时间根据 CC 包容性模式定制搜索。
任何帮助将不胜感激。
我发现的最接近的是:
\b(?:\d[ -]*?){13,16}\b
它可以按预期抓取任何 13-16 位数字(允许中间有破折号或空格),但它也会匹配“1 2 3 4 5 6 7 8 9 10 11”,这显然没有帮助。
如果它们包含空格/破折号,则无法找到有效号码的全包 CC 品牌正则表达式:(但会找到英国电话号码,呵呵):
\b(?:4[0-9]{12}(?:[0-9]{3})?|(?: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}|3[47][0-9]{13}|3(?:0[0-5]|[68][0-9])[0-9]{11}|6(?:011|5[0-9]{2})[0-9]{12}|(?:2131|1800|35\d{3})\d{11})\b
所以然后我尝试用 (?:\d[ -]*?) 替换上面的任何 [0-9] 字符类实例,这将找到带有破折号/空格的有效 CC,但它也匹配所有“1 2 3 4 5 6 7 8 9 10 11" 类型误报。
我对正则表达式很陌生,所以如果我犯了一个巨大的菜鸟错误,请随时指出我正确的方向。谢谢!
编辑:
将 [0-9] 替换为 (?:\d[ -]?) 只是更大的连续字符串部分似乎非常接近我的需要。像以前一样使用相同的驱动器,只得到 311 个匹配项,并且找到了所有 3 个阳性文件,我只能忍受 308 个错误匹配项,但我想还有更好的方法来做到这一点。而且它仍然匹配 13-16 位的字符串和超过 3 个分隔符......
当前正则表达式:
\b(?:4(?:\d[ -]?){12}(?:[0-9]{3})?|(?: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)(?:\d[ -]?){12}|3[47](?:\d[ -]?){13}|3(?:0[0-5]|[68][0-9])(?:\d[ -]?){11}|6(?:011|5[0-9]{2})(?:\d[ -]?){12}|(?:2131|1800|35\d{3})(?:\d[ -]?){11})\b