Regex 为什么这个正则表达式不能正常工作?
我有以下正则表达式:Regex 为什么这个正则表达式不能正常工作?,regex,Regex,我有以下正则表达式: ^\d{1,5}.*[^0-9][0-9]{5}$ 以及以下文字:123国王大道12 OH 12345 我想匹配以1到5位数字开始,以5位数字结束的字符串,它们之间没有其他数字。但是我总是将整个文本作为一个匹配项,尽管它应该跳过,因为12介于123和12345之间 为什么会这样?[^0-9]不应该这样做吗?问题是*哪个匹配任何东西,那么 ^\d{1,5}[^0-9]+[0-9]{5}$ 或者更紧凑 ^\d{1,5}\D+\d{5}$ \D匹配任何非数字。如果希望允许
^\d{1,5}.*[^0-9][0-9]{5}$
以及以下文字:123国王大道12 OH 12345
我想匹配以1到5位数字开始,以5位数字结束的字符串,它们之间没有其他数字。但是我总是将整个文本作为一个匹配项,尽管它应该跳过,因为12介于123和12345之间
为什么会这样?
[^0-9]
不应该这样做吗?问题是*
哪个匹配任何东西,那么
^\d{1,5}[^0-9]+[0-9]{5}$
或者更紧凑
^\d{1,5}\D+\d{5}$
\D
匹配任何非数字。如果希望允许字符串的起始和结束数字之间不包含任何内容,可以使用\D*
。根据您对需求的描述,您似乎希望:
^\d{1,5}[^0-9]*[0-9]{5}$
*
部分匹配任何内容,因此不排除数字。您需要:
^\d{1,5}\D*\d{5}$
其内容为“1-5个数字,后跟任意数量的非数字字符,后跟5个数字”。如果至少需要1个非数字字符,请使用\D+
您以前的正则表达式将匹配,因为'King Drive 12 OH'
将匹配*
,'
将匹配正则表达式中的单个字符[^0-9]
:
^\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}$
为什么会有。*如果你不想要所有东西?@dystroy我补充道。*因为在门牌号(123)和大声朗读正则表达式之间肯定有一些字符,它说“1-5位,后跟任意字符的任何数字,后跟1个非数字字符,后跟5位。”谢谢,如果我还想检查关键字“Drive”,我应该在正则表达式中添加什么?^\d{1,5}\d+[dD]rive\d+\d{5}$---我已经使用了[dD],以防您也要包含未大写的单词。