如何在正则表达式中限制可选的空格匹配



YARP.(是的,另一个正则表达式问题(。

除了具体的例子之外,不确定最清晰的方式来描述这一点。

示例文本:

4444 4444
  1. 4444 4444
  2. 4444444444444444
  3. 44 44 44 44 44 44
  4. 44 44
  5. 4444-4444-4444-4444
  6. 4444(多个空格
  7. ( 4444(多个空格( 4444(多个空格( 4444
  8. 0.444444444444444444 0.4444 4444 4444
  9. 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|35d{3})d{11})b

因此,我尝试将上面的任何 [0-9] 字符类实例替换为 (?:\d[ -]*?(,这将找到带有破折号/空格的有效 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|35d{3})(?:d[ -]?){11})b

由于看起来您希望第四位数字后跟破折号,单个空格或什么都没有,最简单的方法是使用

^(d{4}[s-]?){3}d{4}$

这将符合您的书面标准,但允许混合使用:1234-5678 9012. 如果这不可接受,您可以使用积极的前瞻来验证模式是否重复

相同
^(?=(d{4}){3}|(d{4}-){3}|(d{4}s){3})(d{4}[s-]?){3}d{4}$

第一个正则表达式

  • 从字符串的开头开始:^
  • 查找四个数字 (0-9(,可以选择后跟空格或短划线,并重复此模式 3 次:(d{4}[s-]?){3}
  • 然后是另外四个数字和字符串的末尾:d{4}$

仅从第二个正则表达式中向前看:(?=(d{4}){3}|(d{4}-){3}|(d{4}s){3})

在模式开始
  • 捕获任何内容之前,我们再次从字符串的开头开始,查看前三个重复的模式,并确保两者之间的分隔符相同。

我看到在您的正则表达式示例中,您希望允许 13-16 位数字,而我的是专门针对 16 位的。 对于 13-16 位数字,您需要确定希望这些分隔符的位置。 他们可以在任何地方,只要只有三个并且他们不重复? 我还看到您正在使用单词边界,所以我猜测您正在尝试匹配子字符串。 你可以这样做,但会有点困难。 破折号和空格都是单词边界,因此您可能会在没有查看的情况下得到一些误报。

至于集成到你的 CC 正则表达式中,你懒惰地匹配无限数量的破折号或空格;你只需要?而不是*?。 如果您需要这些空格/数字的更大灵活性,同时仍然限制它们,那么我可能会使用负正则表达式进行验证。

最新更新