2010年7月20日 星期二

C# VB 確認字串是否為有效的電子郵件格式

C# 寫法
using System;
using System.Text.RegularExpressions;

public class RegexUtilities
{
public static bool IsValidEmail(string strIn)
{
// Return true if strIn is in valid e-mail format.
return Regex.IsMatch(strIn,
@"^(?("")("".+?""@)|(([0-9a-zA-Z]((\.(?!\.))|[-!#\$%&'\*\+/=\?\^`\{\}\|~\w])*)(?<=[0-9a-zA-Z])@))" +
@"(?(\[)(\[(\d{1,3}\.){3}\d{1,3}\])|(([0-9a-zA-Z][-\w]*[0-9a-zA-Z]\.)+[a-zA-Z]{2,6}))$");
}
}

VB寫法
Imports System.Text.RegularExpressions

Module RegexUtilities
Function IsValidEmail(ByVal strIn As String) As Boolean
' Return true if strIn is in valid e-mail format.
Return Regex.IsMatch(strIn, _
"^(?("")("".+?""@)|(([0-9a-zA-Z]((\.(?!\.))|[-!#\$%&'\*\+/=\?\^`\{\}\|~\w])*)(?<=[0-9a-zA-Z])@))" + _
"(?(\[)(\[(\d{1,3}\.){3}\d{1,3}\])|(([0-9a-zA-Z][-\w]*[0-9a-zA-Z]\.)+[a-zA-Z]{2,6}))$")
End Function
End Module

這個範例可以解譯規則運算式模式 ^(?("")("".+?""@)|(([0-9a-zA-Z]((\.(?!\.))|[-!#\$%&'\*\+/=\?\^`\{\}\|~\w])*)(?<=[0-9a-zA-Z])@))(?(\[)(\[(\d{1,3}\.){3}\d{1,3}\])|(([0-9a-zA-Z][-\w]*[0-9a-zA-Z]\.)+[a-zA-Z]{2,6}))$,其方式如下表所示

^
在字串開頭開始比對。

(?("")
判斷第一個字元是否為引號。(?("") 是交替建構的開頭。

((?("")("".+?""@)
如果第一個字元是引號,則比對開頭引號,其後接著至少一個任何字元的項目,再加上結尾引號。字串應該以 @ 符號為結束。

|(([0-9a-zA-Z]
如果第一個字元不是引號,則比對由 a 到 z 的任何字母字元,或由 0 到 9 的任何數值字元。

(\.(?!\.))
如果下一個字元是句號,就找到相符的比對。如果不是句號,則往前找下一個字元並繼續進行比對。(?!\.) 是零寬度右不合樣 (Negative Lookahead) 判斷提示,可以避免兩個連續句號在電子郵件地址的本機部分中出現。

|[-!#\$%&'\*\+/=\?\^`\{\}\|~\w]
如果下一個字元不是句號,則比對任何字組字元或下列其中一個字元:-!#$%'*+=?^`{}|~。

((\.(?!\.))|[-!#\$%'\*\+/=\?\^`\{\}\|~\w])*
比對零次或更多次交替模式 (句號後接非句號或幾個字元的其中一個字元)。

@
比對 @ 字元。

(?<=[0-9a-zA-Z])
如果 @ 字元前面的字元是由 A 到 Z、a 到 z 或 0 到 9 的字元,則繼續比對。(?<=[0-9a-zA-Z]) 建構定義零寬度左合樣 (Positive Lookbehind) 判斷提示。

(?(\[)
檢查 @ 後面的字元是否為左方括號。

(\[(\d{1,3}\.){3}\d{1,3}\])
如果是左方括號,則比對後面接著 IP 位址 (四組一至三位的數字,各組間以句號分隔) 及右方括號的左方括號。

|(([0-9a-zA-Z][-\w]*[0-9a-zA-Z]\.)+[a-zA-Z]{2,6})
如果 @ 後面跟著的字元不是左方括號,則比對一個值為 A-Z、a-z 或 0-9 的英數字元,其後接著零個或更多字組字元或連字號的項目,再加上一個值為 A-Z、a-z 或 0-9 的英數字元,然後再接句號。這個模式可能重複一次或多次,然後接著兩個到六個英文字母 (a-z、A-Z) 字元。規則運算式中這個部分的設計是要用來擷取網域名稱。

參考資料 http://msdn.microsoft.com/zh-tw/library/01escwtf(VS.95).aspx

沒有留言:

張貼留言