部落格前言
先交代一下背景,最近工作中經常用到正規表示式,而正規表示式這個東西我個人覺得很雞肋,不用吧,有些功能實現起來會很麻煩。用吧,又不是說工作中經常用到,只是有時候有些需要求用到而已。但是正規表示式只要一段時間不用,就會被遺忘,甚至是忘的一乾二淨。為了一定程度上解決這個雞肋的問題,就有了這篇部落格和我打算寫的這個開源的正規表示式驗證工具的想法。關於正則網上的資料其實已經很多了,之所以還寫這篇部落格只是為了記錄一些現在或者以後工作中可能會用到的正則,然後分享出來,同時也是希望為.net開源做一些事情。
0.寫在前面
記得上一次正兒八經的用正規表示式還是三年前,雖然期間也零零散散的用過一些,但是基本已經忘的差不多了,所以這篇部落格中如果有什麼不對的地方歡迎和感謝大家指正!這裡我只是寫出了一些個人工作中常用到的正則匹配,如果同時有園友願意貢獻一份力量參與到正則開源工具的編碼中,我會非常歡迎。
最近園子裡的”月經貼”越來越多,我就很納悶,這群人是不是閒的蛋疼?你有時間在這”指點江山”批評這個語言抨擊那個環境的,你還不如張開雙手擁抱.net開源大潮呢。隨著.net開源的到來,.net的春天也來了,我們應該伸出雙手為.net開源做一些事情,讓.net社群越來越開源。當然這是題外話,那些月經貼也不關我啥事。
1.原始碼地址
2.正文開始
2.1.: 通用匹配
C#通用匹配規則,可以在呼叫的時候傳入源字串和對應的正則
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 |
/// <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.: 數字匹配
C#正規表示式根據各種需求匹配數字
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 |
/// <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.: 正則截串
C#根據給定的起始字元擷取起始之間的字串
1 2 3 4 5 6 7 8 9 10 11 12 |
/// <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.: 郵箱匹配
C#正規表示式匹配郵箱
1 2 3 4 5 6 7 8 9 |
/// <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匹配
C#正規表示式匹配URL
1 2 3 4 5 6 7 8 9 10 11 |
/// <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.: 日期匹配
C#正規表示式匹配日期
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 |
/// <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.: 密碼匹配
C#正規表示式匹配密碼
1 2 3 4 5 6 7 8 9 |
/// <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.: 郵編匹配
C#正規表示式匹配郵編
1 2 3 4 5 6 7 8 9 |
/// <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.: 電話號碼
C#正規表示式匹配電話
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
/// <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.: 手機號碼
C#正規表示式匹配手機號碼
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
/// <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.: 身份證匹配
C#正規表示式匹配身份證號碼
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
/// <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; } |
3.部落格總結
關於C#正規表示式開源工具暫時就只積累了這麼多。因為目前實際工作中遇到的也就這些,關於這個C#正規表示式開源工具現在只是一個雛形,先把這一分不分享出來,後續得會持續更新C#正規表示式開源工具。希望在以後這個C#正規表示式工具會越來越strong,更希望能得到園友們的support.