首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在regex中限制可选空格匹配

如何在regex中限制可选空格匹配
EN

Stack Overflow用户
提问于 2018-09-21 19:16:10
回答 1查看 189关注 0票数 4

YARP。(是的,另一个判罚问题)。

不确定用什么最清晰的方式来描述这一点,而不是具体的例子。

样本文本:

  1. 444444444444
  2. 4444444444444444
  3. 44 44 44
  4. 4444-4444-4444
  5. 4444 (多个空间) 4444 (多个空间) 4444 (多个空间) 4444
  6. 0.4444444444444444
  7. 0.4444 444444444444

我需要构建一个只匹配1、2和4的正则表达式。要求13-16位数字,破折号和空格可选,但只有在单个空间,不超过3个总数。

这显然是与CC信息搜索相关的,而且我做了大量的研究,找到了很多匹配的例子,大多数,全部或没有,但是没有什么能消除过多的假阳性,比如上面的3和5。我使用的是PowerGREP 5,我已经阅读了关于https://www.regular-expressions.info/tutorial.html的整个教程,我不知道如何在总体匹配中限制可选的空白空间的数量。ie:"1 2 3 4 5 6 7 8 9“和"123 456 789”匹配,如果我选择空间的话。本质上,如果检测到超过3个空格/破折号,我希望regex结束匹配搜索。

附带注意:我在一家处理大量日历数据的公司工作,所以我为许多"1 2 3 4 5 6 7 8“的公司大开方便之门。样式文本字符串正在产生大量的错误点击,即使我花时间定制搜索到CC包含的模式。

任何帮助都是非常感谢的。

我发现最接近的是:

代码语言:javascript
复制
\b(?:\d[ -]*?){13,16}\b

它抓住任何13-16位数字(允许破折号或空格之间)如预期,但它也将匹配"1 2 3 4 5 6 7 8 9 10 11“,这显然是没有帮助的。

所有包含CC品牌的regex,如果它们包含空格/破折号,就无法找到有效的数字:(但是会找到英国电话号码,heh):

代码语言:javascript
复制
\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个字符类实例。这将找到有效的CCs与破折号/空格,但它也匹配所有的"1 2 3 4 5 6 7 8 9 10 11“类型的假阳性。

我对regex非常陌生,所以如果我犯了一个很大的错误,请随时指出正确的方向。谢谢!

编辑:

将0-9替换为(?:d -?)对于更大的连续字符串部分,似乎非常接近我所需要的。与以前一样的驱动器,只有311匹配,和所有3个积极的文件找到,我可以生活在只有308假匹配,但我必须想象有更好的方法来做到这一点。它仍然把13-16位数字的字符串与3个以上的分隔符相匹配.

当前指标:

代码语言:javascript
复制
\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
EN

回答 1

Stack Overflow用户

发布于 2018-09-21 20:06:31

因为看起来你想让第四个数字后面跟着一个破折号,一个空格,或者什么都不需要,所以最简单的方法就是使用。

代码语言:javascript
复制
^(\d{4}[\s\-]?){3}\d{4}$

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

代码语言:javascript
复制
^(?=(\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正则表达式中,您只是懒得匹配无限数量的破折号或空格;您只需要?而不是*?。如果在这些空格/数字的位置需要更多的灵活性,同时仍然限制它们,那么我可能会使用负正则表达式来验证。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52449891

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档