2017-03-02 69 views
-2
驗證電子郵件地址時

我有以下的,我喜歡用它來驗證電子郵件地址的正則表達式模式:不正確的結果與JavaScript的

^[a-zA-Z0-9!#\$%&'\*\+\-\/=\?\^_`\{\|\}~\.][email protected][a-zA-Z0-9-_]+\.[a-zA-Z0-9-.]+[a-zA-Z0-9]$ 

它適用於用戶輸入是相當寬容的,因爲它將使一些無效的邊緣案例會抓住大多數錯誤。

我一直在C#應用程序中使用這個適合年齡的問題。下面是一個簡單的C#腳本,顯示它很樂意的工作:

string pattern = @"^[a-zA-Z0-9!#\$%&'\*\+\-\/=\?\^_`\{\|\}~\.][email protected][a-zA-Z0-9-_]+\.[a-zA-Z0-9-.]+[a-zA-Z0-9]$"; 

string[] data = new string[] { 
    "[email protected]", 
    "[email protected]", 
    "[email protected]", 
    "[email protected]", 
    "[email protected]_123.museum", 
    "o'[email protected]", 
    "[email protected]", 
    "[email protected]@bar.com", 
    "@bar.com", 
    "foo.com", 
    "[email protected]", 
    "[email protected]" 
}; 

foreach (string email in data) 
{ 
    bool valid = Regex.IsMatch(email, pattern); 
    string state = valid ? "pass" : "fail"; 
    Console.WriteLine($"{state}: {email}"); 
} 

這個小腳本給出了下面的輸出,並且是完全一樣的,我期望:

pass: [email protected] 
pass: [email protected] 
pass: [email protected] 
pass: [email protected] 
pass: [email protected]_123.museum 
pass: o'[email protected] 
fail: [email protected] 
fail: [email protected]@bar.com 
fail: @bar.com 
fail: foo.com 
fail: [email protected] 
fail: [email protected] 

我現在需要驗證電子郵件JavaScript中的客戶端地址。當我在JS中嘗試相同的東西時,我得到的結果稍有不同!這裏是我的方案的JS以上版本:

var pattern = "^[a-zA-Z0-9!#\$%&'\*\+\-\/=\?\^_`\{\|\}~\.][email protected][a-zA-Z0-9-_]+\.[a-zA-Z0-9-.]+[a-zA-Z0-9]$"; 

var data = [ 
    /* the same list of emails as above */ 
]; 


for (var i = 0; i < data.length; i++) { 
    var valid = new RegExp(pattern).test(data[i]); 
    var state = valid ? "pass" : "fail"; 
    console.log(state + ": " + data[i]); 
} 

這一次,我得到以下輸出:

pass: [email protected] 
pass: [email protected] 
pass: [email protected] 
pass: [email protected] 
pass: [email protected]_123.museum 
pass: o'[email protected] 
pass: [email protected]    <- this should fail 
pass: [email protected]@bar.com   <- and this! 
fail: @bar.com 
fail: foo.com 
fail: [email protected] 
fail: [email protected] 

注意中間的兩道即是在C#版本失敗!爲了確認我的正則表達式模式是否正確,我使用了regex101.com出色的單元測試功能來檢查它,點擊here查看我的測試/結果。請注意,我故意將其設置錯誤(所有測試'預期'匹配),所以它突出顯示無效的電子郵件地址。這裏的任何方式都是結果的圖片,你可以看到與我使用C#的結果相匹配。

test results

如果有人可以指出我要去的地方錯了,我將不勝感激!

+0

Wiktor的 - 我去來回。但如果你有相同的看法,很酷。 –

+0

Wiktor這可能會得到相同的答案,但我不明白它是如何「完全重複」。 – Ben

+1

Ben - 這是SO的「完全重複」的定義。 (「確切的重複」這個詞應該被廢棄。)定義是:這個問題的答案回答了這個問題。請注意,重複並不一定是壞事:它們增加了搜索表面,導致更多人找到一組規範的,有時候策劃的答案。 –

回答

1

的C#@(逐字)字符串字面治療反斜槓從字面上看,但JavaScript的字符串不這樣做,反斜線仍處於水平轉義字符。如果希望正則表達式級別使用字符串查看單個反斜槓,則每個反斜槓都需要兩個反斜槓。

但是,沒有必要,JavaScript有正則表達式文字

var pattern = /^[a-zA-Z0-9!#\$%&'\*\+\-\/=\?\^_`\{\|\}~\.][email protected][a-zA-Z0-9-_]+\.[a-zA-Z0-9-.]+[a-zA-Z0-9]$/; 

則:

var valid = pattern.test(data[i]); 
//   ^------ Note no `new RegExp(...)` here 
+1

感謝TJ,完美工作,學到了新東西! – Ben