恰好匹配 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}$
你应该使用
^[0-9](-?[0-9]){7}$
^([0-9]-?){8}\b$
参见 regex demo #1 and regex demo #2,其中 \b
用于确保最后一个字符是数字(即单词字符)。
详情
^
- 字符串开头
[0-9]
来匹配一个数字,因为 \d
在各种正则表达式中可能匹配的不仅仅是从 0
到 9
的 ASCII 数字。
(-?[0-9]){7}
- 匹配 7 个可选连字符和数字的序列,并且 不允许在字符串末尾使用尾随连字符 .
([0-9]-?){8}
- 匹配八次出现的数字后跟可选的 -
char
\b$
- 是确保最后一个字符是单词类型的技巧。由于模式只能匹配 -
(非单词字符)或末尾的数字,\b
自动确保最后一个字符是数字。
我正在尝试匹配其中包含 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}$
你应该使用
^[0-9](-?[0-9]){7}$
^([0-9]-?){8}\b$
参见 regex demo #1 and regex demo #2,其中 \b
用于确保最后一个字符是数字(即单词字符)。
详情
^
- 字符串开头[0-9]
来匹配一个数字,因为\d
在各种正则表达式中可能匹配的不仅仅是从0
到9
的 ASCII 数字。(-?[0-9]){7}
- 匹配 7 个可选连字符和数字的序列,并且 不允许在字符串末尾使用尾随连字符 .([0-9]-?){8}
- 匹配八次出现的数字后跟可选的-
char\b$
- 是确保最后一个字符是单词类型的技巧。由于模式只能匹配-
(非单词字符)或末尾的数字,\b
自动确保最后一个字符是数字。