RegEx和验证电话号码

时间:2016-04-20 15:07:00

标签: regex validation expression match regex-group

我正在学习RegEx,我陷入了以下的练习:

我必须匹配:

1 (555) 555-5555
5555555555
1 555-555-5555
555-555-5555

而不是:

1 555)555-5555
(6505552368)
10 (757) 622-7382
555)-555-5555

我的表达(不工作)是:

/([0-9]? ?)?(([0-9]{3})|(\([0-9]{3}\)))( |\-)?\2\5?\2[0-9]/ig
你能帮帮我吗?我无法弄清楚出了什么问题......

3 个答案:

答案 0 :(得分:1)

你可以提出:

^\d\ *(?:\(\d+\))?[- \d]+$

查看demo on regex101.com

细分:

^   - an anchor to bind the expression to the beginning of the line
\d  - one digit of 0-9
\ * - zero or more spaces
(?:\(\d+\))? - digits in parentheses, made optional
[- \d]+ - characters from the specified class
$ - bind the expression to the end 

但引用regex标记:

  

由于正则表达式没有完全标准化,所有问题   使用此标记还应包含指定适用的标记   编程语言或工具。

请更新您的问题并应用使用的编程语言。

正如@Aminah指出的那样,给定的正则表达式存在缺陷,可以通过使用前瞻来避免,例如:

^(?!.*-{2,})\d\ *(?:\(\d+\))?[- \d]+$

(?!.*-{2,})确保没有两个结果斜杠允许。

答案 1 :(得分:1)

您可以使用:

/^(\d? ?)?(\d{3}|\(\d{3}\))[ -]?\d{3}[ -]?\d+$/gm

Demo

说明:

  1. ^(\d? ?)?^匹配字符串的开头。 \d等于[0-9]
  2. (\d{3}|\(\d{3}\)):匹配括号为可选的第二组。你是对的,但你放了太多不必要的括号。
  3. [ -]?:它等于( |-)?
  4. \d+$$用于字符串的结尾。
  5. /gmm标志用于多行

答案 2 :(得分:1)

好的,这个有点棘手,实际测试。

你走了:

^(\d\s?(?:\(\d{3}\))?\s?[\d|\-]{8,12})$

这个只捕获完整的数字并返回完整的数字,而不是其他答案中提到的其他部分。

在这里测试:

https://regex101.com/r/hI5vT2/2