Regex 让问题识别数字模式

Regex 让问题识别数字模式,regex,regex-lookarounds,Regex,Regex Lookarounds,我是新来的正则表达式和我有一些困难的时候,试图检测一个模式 我想识别一个介于4000-4999之间的数字,但同时不能在前面或后面跟有另一个可选字符空格或连字符“-”的数字 例如: 4567(比赛) 我有4999朵玫瑰(匹配) 1234567天过去了(没有匹配) 我的供水账户是123456789(不匹配) 你好,我的手机号码是123-4567-89(不匹配) 我试过下面的模式 (?<!(\d))\b4\d{3}\b(?!(\d)) (? 但它仍然为我提供了123 4567的匹配项-我想\b

我是新来的正则表达式和我有一些困难的时候,试图检测一个模式

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

例如: 4567(比赛)

我有4999朵玫瑰(匹配)

1234567天过去了(没有匹配)

我的供水账户是123456789(不匹配)

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

我试过下面的模式

(?<!(\d))\b4\d{3}\b(?!(\d))
(?
但它仍然为我提供了123 4567的匹配项-我想\b有什么特别之处

如有任何建议,将不胜感激

谢谢,
Eric

如何使用
正向前瞻
正向前瞻
以及
[^]
?我认为它可以得到你想要的结果

模式:

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

(?<!\d[\s-]|\d)4\d{3}(?![\s-]?\d)
或者,如果不支持不同长度的交替(如在Boost或Python中),请使用

(?
请参见和(和a)

详细信息

  • (?/
    (?/
    )(?-不允许有数字和空格/
    -
    ,也不允许有数字紧靠当前位置的左边
  • 4\d{3}
    -
    4
    和任意3位数字
  • (?![\s-]?\d)
    -紧靠右侧,不允许出现带数字的空格/
    -

注意上述解决方案不依赖于单词边界,甚至可能在下划线之间和粘在单词上时匹配。如果你真的想避免这种情况,那么你需要尽一切办法使用单词边界,例如
(?。

,考虑到空格或连字符“-”,你到底指的是什么“考虑到”?Hi CertainPerformance,我的意思是空格或连字符可能存在,也可能不存在,我可能应该将其改为“可选”谢谢。整个模式是否需要匹配4位数字,或者一个子组是否可以匹配工作?(我问的原因是可选空格或连字符具有非固定宽度的后视功能)
\b
(^\w |\w$|\w\w |\w\w)
。对于“123 4567”
\b
匹配空间和4之间的“垂直边界”(以及3和空间之间的“垂直边界”)。因此
(?确实会得到匹配,因为
\b4
前面是一个空格,而不是数字。更正:(?查找问题:如果4位数字在一行的开头,这将不起作用。(例如
1234天过去了
)此外,如果4位数字前的两个字符是数字后接数字或破折号以外的其他字符,则该字符将不匹配,即使它应该匹配。@CertainPerformance我编辑了代码,使其与行首匹配。感谢您的注释。至于第二点,尽管可能,但可能性不大。
(?<!\d[\s-]?)4\d{3}(?![\s-]?\d)
(?<!\d[\s-])(?<!\d)4\d{3}(?![\s-]?\d)