先交代一下背景,最近工作中經常用到正則表達式,而正則表達式這個東西我個人覺得很雞肋,不用吧,有些功能實現起來會很麻煩。用吧,又不是說工作中經常用到,只是有時候有些需要求用到而已。但是正則表達式只要一段時間不用,就會被遺忘,甚至是忘的一干二凈。為了一定程度上解決這個雞肋的問題,就有了這篇博客和我打算寫的這個開源的正則表達式驗證工具的想法。關於正則網上的資料其實已經很多了,之所以還寫這篇博客只是為了記錄一些現在或者以后工作中可能會用到的正則,然后分享出來,同時也是希望為開源做一些事情。

v0.寫在前面
記得上一次正兒八經的用正則表達式還是三年前,雖然期間也零零散散的用過一些,但是基本已經忘的差不多了,所以這篇博客中如果有什么不對的地方歡迎和感謝大家指正!這里我只是寫出了一些個人工作中常用到的正則匹配,如果同時有園友願意貢獻一份力量參與到正則開源工具的編碼中,我會非常歡迎。
v1.源碼地址
v2.正文開始
2.1.: 通用匹配
通用匹配規則,可以在調用的時候傳入源字符串和對應的正則
/// <summary> /// 檢測字符串中是否包含符合正則的子集 /// </summary> /// <param name="source">源字符串</param> /// <param name="reg">正則, e.g. \d+</param> /// <returns>true:包含,反之不包含</returns> publicbool CheckContainsByReg(string source, string reg) { return Regex.Match(source, reg).Success; }
/// <summary> /// 檢測整個字符串是否能匹配正則,而不是包含 /// </summary> /// <param name="source">源字符串</param> /// <param name="reg">正則, e.g. ^\d+$</param> /// <returns>true:匹配,反之不匹配</returns> publicbool CheckStringByReg(string source, string reg) { Regex rg = new Regex(reg, RegexOptions.IgnoreCase); return rg.IsMatch(source); }
/// <summary> /// 從指定字符串中過濾出第一個符合正則匹配的子集 /// </summary> /// <param name="source">源字符串</param> /// <param name="reg">正則, e.g. \d+</param> /// <returns>源字符串的第一個匹配的子集</returns> publicstring GetFirstStringByReg(string source, string reg) { return Regex.Match(source, reg).Groups[0].Value; }
/// <summary> /// 從指定字符串中過濾出所有符合正則匹配的子集 /// </summary> /// <param name="source">源字符串</param> /// <param name="reg">正則, e.g. \d+</param> /// <returns>true:匹配,反之不匹配</returns> publicList<string> GetStringByReg(string source, string reg) { var regex = Regex.Matches(source, reg); List<string> list =new List<string>(); foreach (Match item in regex) { list.Add(item.Value); }
return list; } |
2.2.: 數字匹配
正則表達式根據各種需求匹配數字
/// <summary> /// 從指定字符串中過濾出第一個數字 /// </summary> /// <param name="source">源字符串</param> /// <returns>源字符串的第一個數字</returns> publicstring GetFirstNumberByString(string source) { return Regex. Match(source, @"\d+").Groups[0].Value; }
/// <summary> /// 從指定字符串中過濾出最后一個數字 /// </summary> /// <param name="source">源字符串</param> /// <returns>源字符串的最后一個數字</returns> publicstring GetLastNumberByString(string source) { var reg = Regex.Matches(source, @"\d+"); return reg[reg.Count -1].Value; }
/// <summary> /// 從指定字符串中過濾出所有數字 /// </summary> /// <param name="source">源字符串</param> /// <returns>源字符串的所有數字</returns> publicList<string> GetAllNumberByString( string source) { var reg = Regex.Matches(source, @"\d+"); List<string> list =new List<string>(); foreach (Match item in reg) { list.Add(item.Value); }
return list; }
/// <summary> /// 檢車源字符串中是否包含數字 /// </summary> /// <param name="source">源字符串</param> /// <returns>true:源字符串包含數字;false:源字符串不包含數字</returns> publicbool CheckNumberByString(string source) { return Regex. Match(source, @"\d").Success; }
/// <summary> /// 判斷字符串是否全部是數字且長度等於指定長度 /// </summary> /// <param name="source">源字符串</param> /// <param name="length">指定長度</param> /// <returns>返回值</returns> publicbool CheckLengthByString(string source, int length) { Regex rg = new Regex(@"^\d{" + length +"}$"); return rg.IsMatch(source); } |
2.3.: 正則截串
根據給定的起始字符截取起始之間的字符串
/// <summary> /// 截取字符串中開始和結束字符串中間的字符串 /// </summary> /// <param name="source">源字符串</param> /// <param name="startStr">開始字符串</param> /// <param name="endStr">結束字符串</param> /// <returns>中間字符串</returns> publicstring Substring(string source, string startStr, string endStr) { Regex rg = new Regex("(?<=(" + startStr +"))[.\\s\\S]*?(?=(" + endStr +"))", RegexOptions.Multiline |RegexOptions.Singleline); return rg.Match(source).Value; } |
2.4.: 郵箱匹配
正則表達式匹配郵箱
/// <summary> /// 匹配郵箱是否合法 /// </summary> /// <param name="source">待匹配字符串</param> /// <returns>匹配結果true是郵箱反之不是郵箱</returns> publicbool CheckEmailByString(string source) { Regex rg = new Regex("^\\s*([A-Za-z0-9_-]+(\\.\\w+)*@(\\w+\\.)+\\w{2,5})\\s*$", RegexOptions.IgnoreCase); return rg.IsMatch(source); } |
2.5.: URL匹配
正則表達式匹配URL
/// <summary> /// 匹配URL是否合法 /// </summary> /// <param name="source">待匹配字符串</param> /// <returns>匹配結果true是URL反之不是URL</returns> publicbool CheckURLByString(string source) { Regex rg = new Regex(@"^(https?|s?ftp):\/\/(((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:)*@)?(((\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5]))|((([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.)+(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.?)(:\d*)?)(\/((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)+(\/(([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)*)*)?)?(\?((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)|[\uE000-\uF8FF]|\/|\?)*)?(#((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)|\/|\?)*)?$" , RegexOptions.IgnoreCase); return rg.IsMatch(source); } |
2.6.: 日期匹配
正則表達式匹配日期
/// <summary> /// 匹配日期是否合法 /// </summary> /// <param name="source">待匹配字符串</param> /// <returns>匹配結果true是日期反之不是日期</returns> publicbool CheckDateByString(string source) { Regex rg = new Regex(@"^(\d{4}[\/\-](0?[1-9]|1[0-2])[\/\-]((0?[1-9])|((1|2)[0-9])|30|31))|((0?[1-9]|1[0-2])[\/\-]((0?[1-9])|((1|2)[0-9])|30|31)[\/\-]\d{4})$"); return rg.IsMatch(source); }
/// <summary> /// 從字符串中獲取第一個日期 /// </summary> /// <param name="source">源字符串</param> /// <returns>源字符串中的第一個日期</returns> publicstring GetFirstDateByString(string source) { return Regex.Match(source,@"(\d{4}[\/\-](0?[1-9]|1[0-2])[\/\-]((0?[1-9])|((1|2)[0-9])|30|31))|((0?[1-9]|1[0-2])[\/\-]((0?[1-9])|((1|2)[0-9])|30|31)[\/\-]\d{4})").Groups[0].Value; }
/// <summary> /// 從字符串中獲取所有的日期 /// </summary> /// <param name="source">源字符串</param> /// <returns>源字符串中的所有日期</returns> publicList<string> GetAllDateByString( string source) { var all = Regex.Matches(source, @"(\d{4}[\/\-](0?[1-9]|1[0-2])[\/\-]((0?[1-9])|((1|2)[0-9])|30|31))|((0?[1-9]|1[0-2])[\/\-]((0?[1-9])|((1|2)[0-9])|30|31)[\/\-]\d{4})"); List<string> list =new List<string>(); foreach (Match item in all) { list.Add(item.Value); } return list; } |
2.7.: 密碼匹配
正則表達式匹配密碼
/// <summary> /// 檢測密碼復雜度是否達標:密碼中必須包含字母、數字、特稱字符,至少8個字符,最多16個字符。 /// </summary> /// <param name="source">待匹配字符串</param> /// <returns>密碼復雜度是否達標true是達標反之不達標</returns> publicbool CheckPasswordByString(string source) { Regex rg = new Regex(@"^(?=.*\d)(?=.*[a-zA-Z])(?=.*[^a-zA-Z0-9]).{8,16}$"); return rg.IsMatch(source); } |
2.8.: 郵編匹配
正則表達式匹配郵編
/// <summary> /// 匹配郵編是否合法 /// </summary> /// <param name="source">待匹配字符串</param> /// <returns>郵編合法返回true,反之不合法</returns> publicbool CheckPostcodeByString(string source) { Regex rg = new Regex(@"^\d{6}$"); return rg.IsMatch(source); } |
2.9.: 電話號碼
正則表達式匹配電話
/// <summary> /// 匹配電話號碼是否合法 /// </summary> /// <param name="source">待匹配字符串</param> /// <returns>電話號碼合法返回true,反之不合法</returns> publicbool CheckTelephoneByString(string source) { Regex rg = new Regex(@"^(\(\d{3,4}-)|\d{3.4}-)?\d{7,8}$"); return rg.IsMatch(source); }
/// <summary> /// 從字符串中獲取電話號碼 /// </summary> /// <param name="source">源字符串</param> /// <returns>源字符串中電話號碼</returns> publicstring GetTelephoneByString(string source) { return Regex. Match(source, @"(\(\d{3,4}-)|\d{3.4}-)?\d{7,8}").Groups[0].Value; } |
2.10.: 手機號碼
正則表達式匹配手機號碼
/// <summary> /// 匹配手機號碼是否合法 /// </summary> /// <param name="source">待匹配字符串</param> /// <returns>手機號碼合法返回true,反之不合法</returns> publicbool CheckMobilephoneByString(string source) { Regex rg = new Regex(@"^[1]+[3,5,7,8]+\d{9}$"); return rg.IsMatch(source); }
/// <summary> /// 從字符串中獲取手機號碼 /// </summary> /// <param name="source">源字符串</param> /// <returns>源字符串中手機號碼</returns> publicstring GetMobilephoneByString(string source) { return Regex. Match(source, @"[1]+[3,5,7,8]+\d{9}").Groups[0].Value; } |
2.11.: 身份證匹配
正則表達式匹配身份證號碼
/// <summary> /// 匹配身份證號碼是否合法 /// </summary> /// <param name="source">待匹配字符串</param> /// <returns>身份證號碼合法返回true,反之不合法</returns> publicbool CheckIDCardByString(string source) { Regex rg = new Regex(@"^(^\d{15}$|^\d{18}$|^\d{17}(\d|X|x))$"); return rg.IsMatch(source); }
/// <summary> /// 從字符串中獲取身份證號碼 /// </summary> /// <param name="source">源字符串</param> /// <returns>源字符串中身份證號碼</returns> publicstring GetIDCardByString(string source) { return Regex.Match(source, @"(^\d{15}$|^\d{18}$|^\d{17}(\d|X|x))").Groups[0].Value; } |
v3.博客總結
關於正則表達式開源工具暫時就只積累了這么多。因為目前實際工作中遇到的也就這些,關於這個正則表達式開源工具現在只是一個雛形,先把這一分不分享出來,后續得會持續更新正則表達式開源工具。希望在以后這個正則表達式工具會越來越strong,更希望能得到園友們的support.
作 者:請叫我頭頭哥
出 處:http://www.cnblogs.com/toutou/
關於作者:專注於基礎平台的項目開發。如有問題或建議,請多多賜教!
版權聲明:本文版權歸作者和博客園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文鏈接。
特此聲明:所有評論和私信都會在第一時間回復。也歡迎園子的大大們指正錯誤,共同進步。或者直接私信我
聲援博主:如果您覺得文章對您有幫助,可以點擊文章右下角【推薦】一下。您的鼓勵是作者堅持原創和持續寫作的最大動力!