4

我有以下正则表达式:

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

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

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

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

4

4 回答 4

4

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

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

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

于 2013-07-25T13:42:43.353 回答
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}$
于 2013-07-25T14:13:40.537 回答
2

问题是.*哪个匹配任何东西,怎么样

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

或更紧凑

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

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

于 2013-07-25T13:42:40.263 回答
2

你需要:

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

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

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

于 2013-07-25T13:42:45.463 回答