2011-08-29 59 views
2

我有一個奇怪的問題與我們的電子郵件地址的正則表達式發生。這裏是表達:在Ruby和Javascript中正則表達式崩潰

^(\w)+(([(\.?)\w\-+])*[\w]+)*@((\[([\d]{1,3}\.){3}[\d]{1,3}\])|((\w)+((\.?)[\w\-]+)*\.[a-z]{2,6}))$ 

任何事情,我們已經在它相匹配的精美拋出,問題是與失敗,長串導致表達掛起。在我們的網絡服務器上,它會激增CPU。一些例子如下。問題是當人們錯誤地輸入很長的電子郵件地址時,它會使服務器崩潰。

這是一個失敗的工程。

rubular failure 1[email protected]

這是一種故障導致掛了,你可以看到rubular有問題也是如此。

rubular failure 2[email protected]

有趣的是,如果你要對它進行適當:

rubular pass[email protected]

這很容易通過。

編輯:一個筆記,我也試圖運行這個使用客戶端JavaScript測試,它會失敗/成功以相同的方式。關於這個正則表達式會導致解析器吃掉內存並失敗,我只是不確定它是什麼部分。

+2

這是關於這個一般性的主題一個有趣的閱讀。 http://www.regular-expressions.info/email.html – Ryanmt

+1

如果你不能排除你的字符串包含換行符,你應該使用'\ A'和'\ z'而不是'^'和'$' 。 –

回答

4

您的正則表達式會重複組合正則表達式的最壞情況。當正則表達式匹配失敗時,你的正則表達式會被卡在字符串上。取出* s和? s,你的正則表達式會表現出令人欽佩的效果。

請參閱http://swtch.com/~rsc/regexp/regexp1.html詳細解釋爲什麼你不能做你想要做的事情。

我個人認爲您應該檢查/@/併發送確認電子郵件,但您可能在網絡上的其他地方找到正則表達式,該表達式在匹配大多數電子郵件地址時可以充分發揮作用。

+0

感謝您的回覆,不幸的是我們沒有確認電子郵件的選項,因爲系統未受監控並自動運行。我們還需要考慮RFC規範允許的所有內容。我們發現大多數規則太嚴格。 –

+1

@Jeremy雖然你並沒有真的驗證電子郵件。即使是通過符合RFC的*過濾器*的電子郵件仍可能是無效地址。 – Matt