0

在我的国家,电话号码遵循这样的格式(XX)XXXX-XXXX。但是根据输入文本的模式输入电话号码太主流了。有些人跟随,但有些人没有。我想做一个正则表达式来捕捉所有可能的情况。现在它看起来像这样:

/^[\(]?\d{2}?[\)]?\d{4}[. -]?\d{4}$/

我准备了一些测试用例来证明正则表达式的功能

# GOOD PHONES #
8432115262
843211 5262
843211.5262
843211-5262
32115262
3211.5262
3211 5262
3211-5262
(84)32115262
(84)3211.5262
(84)3211 5262
(84)3211-5262

# BAD PHONES #
!@#$%*()
()32115262
()1231 3213
()1231.3213
()1231-3213
().3213
()-3213
()3213.
()3213-
3211-5a62
sakdiihbnmwlzi

不幸的是,错误的情况()32115262是绕过正则表达式。很清楚为什么。这部分[\(]?\d{2}?[\)]?对错误负责。从左到右,您可以输入零或之一(;您可以输入零位或两位数;您可以输入零个或其中一个)

我希望这部分应该是这样的:如果(输入 ,则必须输入两位数 和),否则可以输入零或两位数。在正则表达式世界中可能会有这样或类似语义的东西吗?

提前致谢

4

2 回答 2

1

试试这个:^(?:\(\d\d\)|\d\d)?\d{4}[. -]?\d{4}$

如果模式匹配(..),则必须匹配内部的 2 个数字。

于 2012-08-03T03:19:46.497 回答
1

可能是这样的:

/^(?:\(\d{2}\)|\d{2}?)\d{4}[. -]?\d{4}$/

我使用了不匹配的组(?: ... )和交替来为电话号码的第一部分提供两个可能的选项。

要么是\(\d{2}\)表示正好有两位数字的括号,要么是\d{2}?表示两位数或空字符串。

将这两个选项与|(这意味着 OR)结合起来,你就得到了上面正则表达式的第一部分:(?:\(\d{2}\)|\d{2}?)

它似乎适用于您所有的测试用例!

于 2012-08-03T03:23:43.287 回答