我是RegEx的新手,在尝试检测模式时遇到了一些困难。
我想标识一个介于4000-4999之间的数字,但同时不得在另一个数字之前或之后带有空格或连字符“-”的可选字符。
例如: 4567(匹配项)
我有4999朵玫瑰(火柴)
1234567天已经过去(没有匹配项)
我的供水帐户是123 4567 89(不匹配)
你好,我的手机号码是123-4567-89(不匹配)
我尝试了以下模式
(?<!(\d))\b4\d{3}\b(?!(\d))
但是它仍然可以匹配123 4567-我想\ b有一些特别之处?
任何建议将不胜感激。
谢谢, 埃里克
答案 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 demo和regex 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 Lookahead
和Positive Lookbehind
与[^ ]
一起使用?我认为它可以为您带来预期的结果。
模式:
(?<=^|[^\d]{2})4[0-9]{3}(?=$|[^\d]{2})