gpt4 book ai didi

regex - 如何限制正则表达式中的可选空白匹配

转载 作者:行者123 更新时间:2023-12-01 01:44:31 24 4
gpt4 key购买 nike

亚普。 (是的,另一个正则表达式问题)。

除了具体的例子之外,不确定描述这个的最清楚的方法。

示例文本:

  • 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[ -]?) 只是更大的连续字符串部分似乎非常接近我需要的。 Grepped 与以前相同的驱动器,只有 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

    最佳答案

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

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

    这将满足您的书面标准,但允许混合使用: 1234-5678 9012 .如果这是 Not Acceptable ,您可以使用正向前瞻来验证模式是否重复相同
    ^(?=(\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 正则表达式而言,您懒惰地匹配无限数量的破折号或空格;你只想要 ?而不是 *? .如果您需要更多的空间/数字的灵活性,同时仍然限制它们,那么我可能会使用负正则表达式来验证。

    关于regex - 如何限制正则表达式中的可选空白匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52449891/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com