我有以下正则表达式:
^\d{1,5}.*[^0-9][0-9]{5}$
和以下文字:123 King Drive 12 OH 12345
我想匹配以 1 到 5 位数字开头并以 5 位数字结尾且它们之间没有其他数字的字符串。但是我总是将整个文本作为匹配项,尽管它应该跳过,因为12介于123和12345之间。
为什么会这样?不应该这样[^0-9]
做吗?
我有以下正则表达式:
^\d{1,5}.*[^0-9][0-9]{5}$
和以下文字:123 King Drive 12 OH 12345
我想匹配以 1 到 5 位数字开头并以 5 位数字结尾且它们之间没有其他数字的字符串。但是我总是将整个文本作为匹配项,尽管它应该跳过,因为12介于123和12345之间。
为什么会这样?不应该这样[^0-9]
做吗?
根据您对要求的描述,您似乎想要这个:
^\d{1,5}[^0-9]*[0-9]{5}$
该.*
部分匹配任何内容,因此不排除数字。
在您的正则表达式中:
^\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}$
问题是.*
哪个匹配任何东西,怎么样
^\d{1,5}[^0-9]+[0-9]{5}$
或更紧凑
^\d{1,5}\D+\d{5}$
\D
匹配任何非数字。\D*
如果您想允许在开始和结束数字之间没有任何内容的字符串,则可以使用。
你需要:
^\d{1,5}\D*\d{5}$
这读作“1-5 位数字,后跟任意数量的非数字字符,后跟 5 位数字”。如果您想要至少 1 个非数字字符,请使用\D+
.
您以前的正则表达式将匹配,因为' King Drive 12 OH'
将匹配.*
并且' '
将匹配单个字符[^0-9]
。