遇到问题时,请识别数字模式

时间:2018-07-12 03:57:12

标签: regex regex-lookarounds

我是RegEx的新手,在尝试检测模式时遇到了一些困难。

我想标识一个介于4000-4999之间的数字,但同时不得在另一个数字之前或之后带有空格或连字符“-”的可选字符。

例如: 4567(匹配项)

我有4999朵玫瑰(火柴)

1234567天已经过去(没有匹配项)

我的供水帐户是123 4567 89(不匹配)

你好,我的手机号码是123-4567-89(不匹配)

我尝试了以下模式

(?<!(\d))\b4\d{3}\b(?!(\d))

但是它仍然可以匹配123 4567-我想\ b有一些特别之处?

任何建议将不胜感激。

谢谢, 埃里克

2 个答案:

答案 0 :(得分:1)

您可以使用

(?<!\d[\s-]|\d)4\d{3}(?![\s-]?\d)

在.NET,JavaScript ECMAScript 2018兼容环境或PyPi正则表达式中,后向模式可以包含?*+{min,}量词,您可以缩短它

(?<!\d[\s-]?)4\d{3}(?![\s-]?\d)

或者,如果不支持不同长度的交替(如Boost或Python),请使用

(?<!\d[\s-])(?<!\d)4\d{3}(?![\s-]?\d)

请参见regex demoregex demo 2(以及.NET regex demo)。

详细信息

  • (?<!\d[\s-]|\d) / (?<!\d[\s-]?) / (?<!\d[\s-])(?<!\d)-无数字和空格/ - 在当前位置的左侧没有数字被允许
  • 4\d{3}-4和任意3位数字
  • (?![\s-]?\d)-在右边,不允许出现1或0个空格/ -,后跟一个数字。

注意上述解决方案不依赖单词边界,甚至可以在下划线之间以及粘贴到单词时匹配。如果您确实想避免这种情况,那么您就必须使用所有字词边界,例如(?<!\d[\s-]|\d)\b4\d{3}\b(?![\s-]?\d)

答案 1 :(得分:0)

如何将Positive LookaheadPositive Lookbehind[^ ]一起使用?我认为它可以为您带来预期的结果。

模式:

(?<=^|[^\d]{2})4[0-9]{3}(?=$|[^\d]{2})

示例:https://regex101.com/r/PYPeCk/2/