2015-04-06 71 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})$