恰好匹配 8 个数字和 0 个或多个破折号

Matching exactly 8 digits with 0 or more dashes

我正在尝试匹配其中包含 0 个或多个破折号的 8 位 phone 数字。例如,以下应全部匹配:

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}$

RegEx Demo

你应该使用

^[0-9](-?[0-9]){7}$
^([0-9]-?){8}\b$

参见 regex demo #1 and regex demo #2,其中 \b 用于确保最后一个字符是数字(即单词字符)。

详情

  • ^ - 字符串开头
  • [0-9] 来匹配一个数字,因为 \d 在各种正则表达式中可能匹配的不仅仅是从 09 的 ASCII 数字。
  • (-?[0-9]){7} - 匹配 7 个可选连字符和数字的序列,并且 不允许在字符串末尾使用尾随连字符 .
  • ([0-9]-?){8} - 匹配八次出现的数字后跟可选的 - char
  • \b$ - 是确保最后一个字符是单词类型的技巧。由于模式只能匹配 -(非单词字符)或末尾的数字,\b 自动确保最后一个字符是数字。