C#正則表達式開源工具,為.net開源綿盡薄力

jopen 10年前發布 | 16K 次閱讀

原文出處: 頭頭哥

博客前言

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

0.寫在前面

記得上一次正兒八經的用正則表達式還是三年前,雖然期間也零零散散的用過一些,但是基本已經忘的差不多了,所以這篇博客中如果有什么不對的地方歡迎和感謝大家指正!這里我只是寫出了一些個人工作中常用到的正則匹配,如果同時有園友愿意貢獻一份力量參與到正則開源工具的編碼中,我會非常歡迎。

最近園子里的”月經貼”越來越多,我就很納悶,這群人是不是閑的蛋疼?你有時間在這”指點江山”批評這個語言抨擊那個環境的,你還不如張開雙手擁抱.net開源大潮呢。隨著.net開源的到來,.net的春天也來了,我們應該伸出雙手為.net開源做一些事情,讓.net社區越來越開源。當然這是題外話,那些月經貼也不關我啥事。

1.源碼地址

2.正文開始

2.1.: 通用匹配

C#通用匹配規則,可以在調用的時候傳入源字符串和對應的正則

/// <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;

}</pre>

2.2.: 數字匹配

C#正則表達式根據各種需求匹配數字

/// <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); }</pre>

2.3.: 正則截串

C#根據給定的起始字符截取起始之間的字符串

/// <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#正則表達式匹配郵箱

/// <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

/// <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#正則表達式匹配日期

/// <summary>
 /// 匹配日期是否合法
 /// </summary>
 /// <param name="source">待匹配字符串</param>
 /// <returns>匹配結果true是日期反之不是日期</returns>
publicbool CheckDateByString(string source) {
    Regex rg = new Regex(@
        "^(\d{4}\/-\/-|((1|2)[0-9])|30|31))|((0?[1-9]|1[0-2])\/-|((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}\/-\/-|((1|2)[0-9])|30|31))|((0?[1-9]|1[0-2])\/-|((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}\/-\/-|((1|2)[0-9])|30|31))|((0?[1-9]|1[0-2])\/-|((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; }</pre>

2.7.: 密碼匹配

C#正則表達式匹配密碼

/// <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#正則表達式匹配郵編

/// <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#正則表達式匹配電話

/// <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);
}

////// ??????????? //////???? ///?????????publicstring GetTelephoneByString(string source) { return Regex.Match(source, @"()</span> \d{3,4}-)|\d{3.4}-)?\d{7,8}").Groups[0].Value; }</pre>

2.10.: 手機號碼

C#正則表達式匹配手機號碼

 /// <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;
    }</pre>

2.11.: 身份證匹配

C#正則表達式匹配身份證號碼

/// <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; }</pre>

3.博客總結

關于C#正則表達式開源工具暫時就只積累了這么多。因為目前實際工作中遇到的也就這些,關于這個C#正則表達式開源工具現在只是一個雛形,先把這一分不分享出來,后續得會持續更新C#正則表達式開源工具。希望在以后這個C#正則表達式工具會越來越strong,更希望能得到園友們的support.

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!