识别数字模式时遇到了问题

3

我对正则表达式不太熟悉,尝试识别模式时遇到了一些困难。

我想要识别4000-4999之间的数字,但同时不可在前后有其他数字,可选字符为空格或连字符“-”。

例如: 4567 (匹配)

我有4999朵玫瑰(匹配)

1234567天已经过去了(不匹配)

我的水费账户是123 4567 89(不匹配)

嗨,我的手机是123-4567-89(不匹配)

我尝试了以下模式:

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

但是它仍然会匹配123 4567 - 我想\b可能有一些特殊的东西?

非常感谢任何建议。

谢谢, Eric


“with consideration of space or hyphen "-".” 这句话中的“with consideration of”是指“考虑到”的意思。 - CertainPerformance
嗨,CertainPerformance,我的意思是空格或连字符可能存在,我应该重新表达为“可选的”。 - Eric Sun
顺便提一下,如果您能在问题中标记您正在使用的编程语言,那可能会更好。 - ytu
@CertainPerformance 我需要匹配4位数字。实际上,ytu的解释给了我一些想法 - 我在我的前后查找中添加了\s,这似乎解决了“空格”的情况。(?<!(\d\s))\b4\d{3}\b(?!(\s\d))。我可以单独为连字符创建类似的方程式。 - Eric Sun
1
更正:(?<!(\d[\s-]))\b4\d{3}\b(?!([\s-]\d)) 将满足我所有的要求 :) 谢谢大家。 - Eric Sun
显示剩余4条评论
2个回答

1

你可以使用

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

在.NET、JavaScript ECMAScript 2018兼容环境或PyPi regex中,如果lookbehind模式可以包含?*+{min,}量词,则可以缩短它。
(?<!\d[\s-]?)4\d{3}(?![\s-]?\d)

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

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

请查看正则表达式演示正则表达式演示2(以及.NET正则表达式演示)。

详情

  • (?<!\d[\s-]|\d) / (?<!\d[\s-]?) / (?<!\d[\s-])(?<!\d) - 不允许数字和空格/-,或者当前位置左侧紧贴着数字
  • 4\d{3} - 4 和任意三个数字
  • (?![\s-]?\d) - 立即在右侧,不允许出现一个空格/-,后跟一个数字。

注意 上述解决方案不依赖于单词边界,甚至可以匹配下划线之间和粘在单词上的内容。如果您真的想避免这种情况,则必须使用单词边界,例如(?<!\d[\s-]|\d)\b4\d{3}\b(?![\s-]?\d)


0

使用正向先行断言正向后行断言以及[^ ]如何?我认为这样可以得到你想要的结果。

模式:

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

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


回顾问题:如果4个数字位于行的开头,这将无法工作。(例如 1234天已经过去)。此外,如果4个数字前面的两个字符是数字后跟除数字或破折号以外的其他字符,则不会匹配,尽管它应该匹配。 - CertainPerformance
@CertainPerformance 我已经编辑了代码,使其与行首匹配。感谢您的提醒。至于第二点,尽管可能性存在,但似乎高度不太可能。 - Ibrahim

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接