Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 正好匹配8个数字和0个或多个破折号_Regex_String_Numbers_Phone Number - Fatal编程技术网

Regex 正好匹配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

我正在尝试匹配一个精确的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][-]?[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
    9
    的ASCII数字
  • (?[0-9]){7}
    -匹配可选连字符和数字的7个序列,将不允许在字符串末尾使用尾随连字符
  • ([0-9]-?){8}
    -匹配一个数字的八个匹配项,后跟可选的
    -
    字符
  • \b$
    -是确保最后一个字符为单词类型的技巧。由于模式只能匹配
    -
    (非单词字符)或结尾的数字,
    \b
    自动确保最后一个字符是数字

在应用正则表达式之前,从字符串中除去除数字以外的所有内容不是更容易吗?那你就不必担心破折号了,因为它们根本就不在那里。@MarcB我不能剥掉东西。这是针对
元素的
模式
属性的。与您的问题没有直接关系,但是如果在元素中只有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我已经更新了我的答案,它仍然不允许拖尾
-
,并且是“简单的”