这个正则表达式可以简化吗?

时间:2015-04-06 18:25:51

标签: regex

我有这个正则表达式:

^(\(\d{3}\)[ ]?\d{3}-\d{4})|(\d{3}\.\d{3}\.\d{4})|(\d{3}\-\d{3}\-\d{4})|[0-9]{10}$

我需要这些电话号码格式才能匹配:

  • (555)555-5555
  • (555)555-5555
  • 555-555-5555
  • 555.555.5555
  • 5555555555

有没有办法简化我当前的正则表达式?

3 个答案:

答案 0 :(得分:2)

RegexBuddy显示:

\(?\b[0-9]{3}\)?[-. ]?[0-9]{3}[-. ]?[0-9]{4}\b

答案 1 :(得分:2)

就个人而言,我不打算验证用户的格式。无论你想出什么,在某些情况下都可能会失败。我认为接受更宽松的输入并尽力纠正更好。

老实说,当您需要的是10位数时,谁关心()-.?您可以在后端轻松添加格式。

相反,我会做这样的事情

// ugly user input, but still valid
var userInput = "(500) 423.2345";

// remove all non-digits
var phone = userInput.replace(/\D/g, '');
//=> "5004232345"

// verify that 10 digits are present
if (phone.length !== 10) {
  alert("invalid phone number");
}

然后,您可以将数字存储为您想要的任何格式

// example
[
  "(",
  phone.substr(0,3),
  ")",
  phone.substr(3,3),
  "-",
  phone.substr(6,4)
].join(" ")

// "( 500 ) 423 - 2345"

答案 2 :(得分:0)

如果您使用捕获组来捕获分隔符并使用反向引用\1来重复使用它,您可以简化一些并避免使用多种备选方案:

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