Regex 正好匹配8个数字和0个或多个破折号
我正在尝试匹配一个精确的8位电话号码,其中包含0个或更多破折号。例如,以下各项应全部匹配:Regex 正好匹配8个数字和0个或多个破折号,regex,string,numbers,phone-number,Regex,String,Numbers,Phone Number,我正在尝试匹配一个精确的8位电话号码,其中包含0个或更多破折号。例如,以下各项应全部匹配: 12345678 123456-78 1234-5678 1-2-3-4-5-6-7-8 如果我忽略破折号,那就相当简单了。我可以使用: [\d]{8} 如果我想匹配至少包含8个字符(数字和破折号)的字符串,我可以使用: [\d-]{8,} 然而,在这里我不能给字符数设置上限,因为我不知道这个数字会有多少破折号 我想到的唯一方法是使用: [0-9][-]?[0-9][-]?[0-9][-]?[0-9
12345678
123456-78
1234-5678
1-2-3-4-5-6-7-8
如果我忽略破折号,那就相当简单了。我可以使用:
[\d]{8}
如果我想匹配至少包含8个字符(数字和破折号)的字符串,我可以使用:
[\d-]{8,}
然而,在这里我不能给字符数设置上限,因为我不知道这个数字会有多少破折号
我想到的唯一方法是使用:
[0-9][-]?[0-9][-]?[0-9][-]?[0-9][-]?[0-9][-]?[0-9][-]?[0-9][-]?[0-9]
然而,对于一些(至少在我看来)看似简单的事情来说,这似乎真的很混乱。有更简单的方法吗?您可以使用这个正则表达式,在每个数字后面加上可选的
-
:
^([0-9]-?){8}$
如果您的正则表达式支持\d
,请使用:
^(\d-?){8}$
您应该使用
^[0-9](?[0-9]){7}$
^([0-9]-?){8}\b$
请参阅和,其中\b
用于确保最后一个字符是数字(即单词字符)
细节
-字符串的开头^
匹配一个数字,因为各种正则表达式风格中的[0-9]
可能匹配的不仅仅是\d
到0
的ASCII数字9
-匹配可选连字符和数字的7个序列,将不允许在字符串末尾使用尾随连字符(?[0-9]){7}
-匹配一个数字的八个匹配项,后跟可选的([0-9]-?){8}
字符-
-是确保最后一个字符为单词类型的技巧。由于模式只能匹配\b$
(非单词字符)或结尾的数字,-
自动确保最后一个字符是数字\b
元素的模式
属性的。与您的问题没有直接关系,但是如果在元素中只有1个元素,则不需要使用括号([…]
)。Anubhava的^([0-9]-?){8}$
很短,但允许尾随连字符。较短的-^(\d-?){8}$
较长的-^([0123456789]-?){8}$
我为\d
添加了一个注释,但在sed
或awk
等所有工具中都不支持它,就这么长<代码>^([0123456789]-?)([0123456789]-?)([0123456789]-?)([0123456789]-?)([0123456789]-?)([0123456789]-?)([0123456789]-?)$@nicael,甚至更好。最好是直言不讳/s
(但只匹配7位数字)好主意,不允许这样的尾随连字符。在这种情况下,这并不重要,因为所有连字符都会在正则表达式之后以编程方式剥离,所以我只想用anubhava的答案让它稍微简单一点。我明白了,如果不使用JS,使用\A(-[0-9]){8}会更好\z
因为在几乎任何正则表达式中,$都在字符串中的最后一行之前匹配,意思是“1-2-3-4-5-6-7-8\n”(注意演示文本中有一个换行符)。我使用的是JS,但这是在JS之前,来自HTML5
元素的patern
属性。如果有尾随字符,这真的没什么大不了的,因为每个非数字字符稍后都会被JS剥离。然而,即使它真的很重要,这个元素(至少在支持的浏览器中是如此)。@Mike我已经更新了我的答案,它仍然不允许拖尾-
,并且是“简单的”