學習C#高階程式設計之正規表示式

正版遊戲的受害者發表於2018-07-11

正規表示式

什麼是正規表示式?

英文RegularExpression,是電腦科學的一個重要概念,她使用一種數學演算法來解決計算機程式中的文字檢索,匹配等問題,正規表示式語言是一種專門用於字串處理的語言。在很多語言中都提供了對它的支援,c#也不例外,它可以幫我們解決下面的問題:

    1,檢索:通過正規表示式,從字串中獲取我們想要的部分

    2,匹配:判斷給定的字串是否符合正規表示式的過濾邏輯

你可以認為正規表示式表述了一個字串的書寫規則

下面是通過查詢在頭部和尾部進行替換。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Text.RegularExpressions;

namespace 正規表示式
{
    class Program
    {
        static void Main(string[] args)
        {
            string s = "I am blue cat.";
            //string re = Regex.Replace(s, "^", "開始:");//搜尋開始
            
            //Console.WriteLine(re);

            string res = Regex.Replace(s, "$", "結束");//搜尋結尾
            Console.WriteLine(res);
            Console.ReadKey();
        }
    }
}

基本語法元字元

正規表示式就是由普通字元以及特殊字元(成為元字元)組成的文字模式。該模式描述在查詢文字主體時待匹配的一個或多個字串。

@符號

我們經常在正規表示式字串前面加上@字元,這樣不讓編譯器去解析其中的轉義字元,而作為正規表示式的語法(元字元)存在。strings =@"www.baidu.com \n lkjsdflkj";

基本語法元字元

字元         說明

.              匹配除換行符以外的任意字元

\w          匹配字母、數字、下劃線、漢字  (指大小寫字母、0-9的數字、下劃線_)

\W          \w的補集  (除“大小寫字母、0-9的數字、下劃線_”之外)

\s          匹配任意空白符  (包括換行符/n、回車符/r、製表符/t、垂直製表符/v、換頁符/f)

\S          \s的補集  (除\s定義的字元之外)

\d          匹配數字  (0-9數字)

\D          表示\d的補集  (除0-9數字之外)

在正規表示式中,\是轉義字元.* 是元字元 如果要表示一個\ . *字元的話,需要使用\\ \. \


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Text.RegularExpressions;

namespace _004_基本語法元字元
{
    class Program
    {
        static void Main(string[] args)
        {
            
            string s = Console.ReadLine();
            //bool isMatch = true;//預設標誌位,表示s是一個合法字元密碼(全部都是數字)
            //for(int i = 0; i < s.Length; i++)
            //{
            //    if (s[i] < '0' || s[i] > '9')//當前字元不是數字字元
            //    {
            //        isMatch = false;
            //        break;
            //    }
            //}
            //if (isMatch)
            //{
            //    Console.WriteLine("是一個合法密碼。");
            //}
            //else
            //{
            //    Console.WriteLine("不是一個合法密碼。");
            //}

            //校驗只需要輸入數字
            //string pattern = @"^\d*$";//正規表示式   ^表示開頭 \d*表示零個或多個數字 $表示結尾
            //bool isMatch = Regex.IsMatch(s, pattern);

            string pattern = @"^\W*$";//校驗只允許輸入除大小寫字母、0-9的數字、下劃線_以外的任何字
            bool isMatch = Regex.IsMatch(s, pattern);

            Console.WriteLine(isMatch);
            Console.ReadKey();
        }
    }
}

反義字元

字元              說明

\W              \w的補集  (除“大小寫字母、0-9的數字、下劃線_”之外)

\S              \s的補集  (除\s定義的字元之外)

\D              表示\d的補集  (除0-9數字之外)

\B              匹配不是單詞開頭或結束的位置

[ab]          匹配中括號中的字元

[a-c]          a字元到c字元之間是字元

[^x]          匹配除了x以外的任意字元

[^adwz]      匹配除了adwz這幾個字元以外的任意字元

//示例:查詢除ahou這之外的所有字元

stringstrFind1 = "I am a Cat!", strFind2 = "My Name's Bluecat!";            

Console.WriteLine("除ahou這之外的所有字元,原字元為:"+ strFind1 + "替換後:" + Regex.Replace(strFind1,@"[^ahou]","*"));

Console.WriteLine("除ahou這之外的所有字元,原字元為:"+ strFind2 + "替換後:" + Regex.Replace(strFind2, @"[^ahou]","*"));


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Text.RegularExpressions;

//[ab]      匹配中括號中的字元
//[a-c]     a字元到c字元之間是字元
//[^x]      匹配除了x以外的任意字元
//[^adwz]   匹配除了adwz這幾個字元以外的任意字元


namespace _005_反義字元
{
    class Program
    {
        static void Main(string[] args)
        {
            string s = "I am a bat man!";
            //string pattern = @"[^atou]";//它代表一個字元,除了atou之外的任意一個字串
            string pattern = @"[ab]";
            string str = Regex.Replace(s, pattern,"*");
            Console.WriteLine(str);
            Console.ReadKey();
            
        }
    }
}

重複描述字元

字元              說明

{n}              匹配前面的字元n次

{n,}              匹配前面的字元n次或多於n次

{n,m}          匹配前面的字元n到m次

?              重複零次或一次

+              重複一次或更多次

*              重複零次或更多次

示例:校驗輸入內容是否為合法QQ號(備註:QQ號為5-12位數字)

stringisQq1 = "1233", isQq2 = "a1233", isQq3 ="0123456789123", isQq4 = "556878544";

stringregexQq = @"^\d{5,12}$";

Console.WriteLine(isQq1+"是否為合法QQ號(5-12位數字):"+ Regex.IsMatch(isQq1, regexQq));

Console.WriteLine(isQq2+ "是否為合法QQ號(5-12位數字):" + Regex.IsMatch(isQq2, regexQq));

Console.WriteLine(isQq3+ "是否為合法QQ號(5-12位數字):" + Regex.IsMatch(isQq3, regexQq));

Console.WriteLine(isQq4+ "是否為合法QQ號(5-12位數字):" + Regex.IsMatch(isQq4, regexQq));


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Text.RegularExpressions;

//{n}       匹配前面的字元n次
//{n,}      匹配前面的字元n次或多於n次
//{n,m}     匹配前面的字元n到m次
//?         匹配零次或一次
//+         匹配一次或更多次
//*         匹配零次或更多次

namespace _006_重複描述字元
{
    class Program
    {
        static void Main(string[] args)
        {
            string qq1 = "947662512";
            string qq2 = "454121451215";
            string qq3 = "d23123123213";
            string pattern = @"^\d{6,10}$";

            Console.WriteLine(Regex.IsMatch(qq1, pattern));
            Console.WriteLine(Regex.IsMatch(qq2, pattern));
            Console.WriteLine(Regex.IsMatch(qq3, pattern));
            Console.ReadKey();
        }
    }
}

擇一匹配

字元              說明

|              將兩個匹配條件進行邏輯“或”(Or)運算
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Text.RegularExpressions;


//|    擇一匹配
namespace _007_擇一匹配
{
    class Program
    {
        static void Main(string[] args)
        {
            //string s = "34((&*dsadas大薩達奧德賽";
            //string pattern = @"\d|[a-z]";
            //MatchCollection col = Regex.Matches(s, pattern);
            //foreach(Match match in col)
            //{
            //    Console.WriteLine(match);//呼叫tostring方法,會輸出match所匹配到的字串
            //}

            string s = "zhangsan;lisi;wangwu,zhaoliu";
            //string pattern = @"[;,.]";
            string pattern = @"[;]|[,]|[.]";
            string[] resArray = Regex.Split(s, pattern);
            foreach(var res in resArray)
            {
                Console.Write(res+" "); 

            }
            Console.ReadKey();
        }
    }
}

對正規表示式進行分組

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Text.RegularExpressions;

namespace _008_對正規表示式進行分組
{
    class Program
    {
        static void Main(string[] args)
        {
            string inputStr = Console.ReadLine();
            //重複多個字元使用(abcd) {n}進行分組限定
            string strGroup1 = @"(ab\w{2}){2}"; // == "ab\w{2}ab\w{2}"
            Console.WriteLine("分組字元重複兩次替換為5555,結果為:" + Regex.Replace(inputStr, strGroup1, "5555"));
            Console.ReadKey();
        }
    }
}

相關文章