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

Why does this Regex not work Properly?

我有以下regex:

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

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

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

为什么会这样?难道不是[^0-9]就应该这样做吗?


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

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

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


在你的正则表达式中:

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

示例文本:

1
123 King Drive 12 OH 12345

——

^ D 1,5匹配"123"

*与"King Drive 12 Oh"匹配

[^0-9]与""匹配

[0-9]5$与"12345"匹配

正如其他人所建议的,类似这样的事情可以避免这个问题,正如您明确地说(与使用".*"不同)不匹配字符串中间的任何非数字:

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


你需要:

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

这表示"1-5位,后面是任意数量的非数字字符,后面是5位。"如果您需要至少1个非数字字符,请使用\D+

您以前的regex将匹配,因为' King Drive 12 OH'将匹配.*' '将匹配单个字符[^0-9]


问题是.*与任何东西都匹配,那怎么办?

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

或者更紧凑

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

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