正则表达式将电话号码与[a | b]模式匹配

时间:2014-08-16 04:24:18

标签: regex

我的电话号码如下格式

415-555-1234
(416)555-3456
202 555 4567
4035555678
1 416 555 9292

我要用这个表达式匹配所有这些,

[\(|\d\s]?\d{3}[-|\)\s]?\d{3}[-|\s]?\d{4}

它匹配除最后一个之外的所有。无法匹配上一个电话号码的前导"1 "。 我想知道为什么这个表达不起作用。为什么\d\s无法匹配上一个电话号码的前导"1 "

2 个答案:

答案 0 :(得分:1)

你滥用方括号。它们包含一个字符类,可以推断出列表中的任何项目都应该匹配。请改用:

^(?:\(|\d\s)?\d{3}[-\)\s]?\d{3}[-\s]?\d{4}

这是regex demo


但是,上面只修复了你的正则表达式错误。要匹配测试用例的实际完整格式,您应该使用此正则表达式:

^(?:\d\s)?(?:\(\d{3}\)|\d{3})(\s|(-)?)?\d{3}(?(2)-|(?(1)\s|-?))\d{4}$
  • ^字符串开头。
  • (?:\d\s)?可选的数字 - 空白序列。
  • (?:群组
    • \(\d{3}\)括号内有三位数字。
    • |
    • \d{3}三位数。
  • )
  • (\s|(-)?)?捕获组:可选的空格或连字符。第二个捕获组试图捕获连字符。
  • \d{3}三位数。
  • (?(2)如果我们匹配连字符,那么:
    • -在此处匹配连字符。
    • | ELSE
    • (?(1)如果我们匹配空格,那么:
      • \s在这里匹配一个空格。
      • | ELSE
      • -?如果需要,可以匹配连字符。
    • )
  • )
  • \d{4}四位数。
  • $字符串结束。

这是UPDATED regex demo


但是,上述内容与语法匹配,但不捕获数字。要捕获数字,您必须将上述正则表达式扩展为以下内容:

^(?:\d\s)?(?|\((\d{3})\)|(\d{3}))(?|-(\d{3})-|\s(\d{3})\s|(\d{3})-?)(\d{4})$

这是regex demo!请注意,捕获第1组,第2组和第3组会保留电话号码中的前三个,后三个和最后四个数字。

答案 1 :(得分:1)

因为[\(|\d\s]没有按照您的想法行事。它是一个匹配(|,0-9中任何数字或任何空白字符的字符类。你不需要这里的角色课。

我认为这是你正在寻找的东西:

(?:\d )?\(?\d{3} ?\)?-?\d{3} ?-?\d{4}

RegEx Demo