2015-04-06 75 views
0

我有这样的正则表达式:这个正则表达式可以简化吗?

^(\(\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

有什么办法可以简化我目前的正则表达式吗?

+2

如果你'想要**严格**然后保持原样。 – hwnd

+0

@hwnd我相信你是对的。对于正则表达式我还是个新手,所以我想在投入之前先与一些超级大师进行验证。谢谢。 – Bazinga

+0

我希望你不是要验证电话号码字段。处理电话号码的正确方法是去掉非数字字符,然后评估数字序列。 – zzzzBov

回答

2

使用RegexBuddy表演:

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

感谢您的回答,但某些匹配得不到。我只需要严格匹配上面提到的格式。我不能混用“。”用“ - ”表示。 – Bazinga

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" 
+0

它必须是正则表达式来处理我们当前的体系结构。 – Bazinga

+0

[现在你有两个问题](http://blog.codinghorror.com/regular-expressions-now-you-have-two-problems/)。 – naomik

0

可以简化一点,避免如果几个备选方案使用捕获组来捕获分隔符和反向引用\1以重用它:

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