为什么这个正则表达式不能正常工作?

时间:2013-07-25 13:40:25

标签: regex

我有以下正则表达式:

 ^\d{1,5}.*[^0-9][0-9]{5}$

以及以下文字: 123 King Drive 12 OH 12345

我希望匹配以1到5位数字开头的字符串,并以5位数字结尾,并且它们之间没有其他数字。但我总是将整个文本作为匹配,但它应该跳过,因为 12 介于 123 12345 之间。

为什么会这样?不应该[^0-9]做这个伎俩吗?

4 个答案:

答案 0 :(得分:4)

根据您对要求的描述,您似乎想要这样:

^\d{1,5}[^0-9]*[0-9]{5}$

.*部分匹配任何内容,因此不排除数字。

答案 1 :(得分:2)

问题是.*匹配任何

是什么
^\d{1,5}[^0-9]+[0-9]{5}$

或更紧凑

^\d{1,5}\D+\d{5}$

\D匹配任何非数字。如果要允许字符串在开始和结束数字之间没有任何内容,则可以使用\D*

答案 2 :(得分:2)

你需要:

^\d{1,5}\D*\d{5}$

读为" 1-5位数字,后跟任意数量的非数字字符,后跟5位数字。"如果您想要至少1个非数字字符,请使用\D+

您之前的正则表达式会匹配,因为' King Drive 12 OH'匹配.*' '会匹配单个字符[^0-9]

答案 3 :(得分:2)

在你的正则表达式中:

^\d{1,5}.*[^0-9][0-9]{5}$

示例文字:

123 King Drive 12 OH 12345

-

^ \ d {1,5}匹配“123”

。*匹配“King Drive 12 OH”

[^ 0-9]匹配“”

[0-9] {5} $匹配“12345”

正如其他人也建议的那样,这样的事情可以避免这个问题,因为你明确地说(不像使用“。*”)不匹配字符串中间的任何非数字:

^\d{1,5}\D+\d{5}$