需要正则表达式以匹配未格式化的电话号码语法

时间:2011-02-09 16:02:13

标签: javascript regex

我需要一个Javascript的正则表达式,它将匹配除了数字和“x”(用于扩展名)之外的所有字符的电话号码。以下是一些示例格式:

12223334444
2223334444
2223334444x5555

您可以保证始终至少有10位数字,因为前导“1”和扩展名是可选的。 'x'后可能出现的数字位数也没有限制。我希望将数字拆分为以下反向引用:

(1)(222)(333)(4444)x(5555)

上面的括号说明了我希望如何将数字拆分为反向引用。例如,第一组括号将分配给反向引用$ 1。

到目前为止,这是我为正则表达式提出的。请记住,我对正则表达式并不是那么好,而regexlib.com并没有真正帮助我在这个部门。

(\d{3})(\d{3})(\d{4})

上面的正则表达式在我上面的第一个代码片段中处理了我的示例测试用例列表中的第二种情况。但是,需要修改此正则表达式以处理可选的“1”和扩展名。对此有何帮助?谢谢!

4 个答案:

答案 0 :(得分:1)

如果我是你,我不会为此做一个正则表达式 - 它会导致比解决更多的头痛。我会:

  1. 拆分“x”上的电话号码,将最后一部分存储在扩展名中。
  2. 查看初始部分的长度,9或10位数
    • 如果是10位数,请检查第一个是1,将其切掉,然后继续使用9位数的流程:
    • 如果是9位数,请将其拆分为3-3-4并将其拆分为区号,交换号码。
  3. 根据NANP
  4. 的规则验证区号和交换代码

    这将验证您的电话号码并且更加轻松,并且可以让您更轻松地执行“无X11区号”或“无X11交换代码”等规则 - 您必须这样做无论如何,只使用普通的字符串操作将其拆分为子字符串可能更容易。

答案 1 :(得分:1)

正则表达式选项对我来说似乎完全没问题。

var subject = '2223334444';
result = subject.replace(/^1?(\d{3})(\d{3})(\d{4})(x\d+)?$/mg, "1$1$2$3$4");
alert(result);
if(!result.match(/^\d{11}(?:x\d+)?/))
    alert('The phone number came out invalid. Perhaps it was entered incorrectly');

如果没有扩展

,则会显示12223334444

我希望你想把它调整一些,让我知道应该如何。

答案 2 :(得分:0)

我做了一些测试,这是我找到的解决方案。我还没有发现这种情况有所破坏的情况,但是如果有人发现它有问题,请告诉我:

(1)?(\d{3})(\d{3})(\d{4})(?:x(\d+))?

更新: 我修改了上面的正则表达式以处理更多边缘情况。如果出现意外情况,这个新版本将完全失败。

(^1|^)(\d{3})(\d{3})(\d{4})($|(?:x(\d+))$)

答案 3 :(得分:0)

我的正则表达式是:

/\+?[0-9\-\ \(\)]{10,22}/g