C# 正則表達式

來源:互聯網
上載者:User
什麼是Regex

     Regex是用來檢驗和操作字串的強大工具。簡單的理解Regex可以認為是一種特殊的驗證字串。Regex常見運用是驗證使用者輸入資訊格式,比如上面的那組“\w{1,}@\w{1,}\.\w{1”,實際上就是驗證郵件地址是否合法的;當然Regex不僅僅是用於驗證,可以說只要運用字串的地方都可以使用Regex;

涉及的基本的類

     Regex在英文中寫作(Regular Expression),根據Regex的使用範圍和單詞意思,.NET將其命名空間設定為System.Text.RegularExpressions;

     在該命名空間內包括了8個基本的類:Capture、CaptureCollection、Group、GroupCollection、Match、MatchCollection、Regex和RegexCompilationInfo1所示;

圖1 MSDN Library中Regex命名空間

 

Capture 用於單個運算式捕獲結果
CaptureCollection 用於一個序列進行字串捕獲
Group 表示單個捕獲的結果
GroupCollection 表示擷取的群組的集會
Match 表示匹配單個Regex結果
MatchCollection 表示通過迭代方式應用Regex到字串中
Regex 表示不可變的Regex
RegexCompilationInfo 將編譯Regex需要提供資訊

[注意]

     本文屬於初學Regex的入門文章,對於進階的分組(Group)及其涉及文法等在這裡不做介紹;

Regex基礎知識

  • 基本文法

     在Regex中擁有一套自己的文法規則,常見文法包括;字元匹配、重複匹配、字元定位、轉義匹配和其他進階文法(字元分組、字元替換和字元決策);

     字元匹配文法:

字元文法 文法解釋 文法例子
\d 匹配數字(0~9) ‘\d’匹配8,不匹配12;
\D 匹配非數字 ‘\D’匹配c,不匹配3;
\w 匹配任意單字元 ‘\w\w’ 匹配A3,不匹配@3;
\W 匹配非單字元 ‘\W’匹配@,不匹配c;
\s 匹配空白字元 ‘\d\s\d’匹配3 d,不匹配abc;
\S 匹配非Null 字元 ‘\S\S\S’匹配A#4,不匹配3 d;
. 匹配任一字元 ‘....’匹配A$ 5,不匹配換行;
[…] 匹配括弧中任一字元 [b-d]匹配b、c、d, 不匹配e;
[^…] 匹配非括弧字元 [^b-z]匹配a,不匹配b-z的字元;

     重複匹配文法:

重複文法 文法解釋 文法例子
{n} 匹配n次字元 \d{3}匹配\d\d\d,不匹配\d\d或\d\d\d\d
{n,} 匹配n次和n次以上 \w{2}匹配\w\w和\w\w\w以上,不匹配\w
{n,m} 匹配n次上m次下 \s{1,3}匹配\s,\s\s,\s\s\s,不匹配\s\s\s\s
? 匹配0或1次 5?匹配5或0,不匹配非5和0
+ 匹配一次或多次 \S+匹配一個以上\S,不匹配非一個以上\S
* 匹配0次以上 \W*匹配0以上\W,不匹配非N*\W

     字元定位文法:

重複文法 文法解釋 文法例子
^ 定位後面模式開始位置
$ 前面模式位於字串末端
\A 前面模式開始位置
\z 前面模式結束位置
\Z 前面模式結束位置(換行前)
\b 匹配一個單詞邊界
\B 匹配一個非單詞邊界

     轉義匹配文法:

轉義文法 涉及字元(文法解釋) 文法例子
“\”+實際字元 \ . * + ? | ( ) { }^ $ 例如:\\匹配字元“\”
\n 匹配換行
\r 匹配斷行符號
\t 匹配水平定位字元
\v 匹配垂直定位字元
\f 匹配換頁
\nnn 匹配一個8進位ASCII
\xnn 匹配一個16進位ASCII
\unnnn 匹配4個16進位的Uniode
\c+大寫字母 匹配Ctrl-大寫字母 例如:\cS-匹配Ctrl+S

  • 構造正則表達的方法

     構造Regex需要涉及Regex類,在Regex類中包括:IsMatch()、Replace()、Split()和Match的類;

(1) IsMatch()方法;

     IsMatch()方法實際上是一個返回Bool值得方法,如果測試字元滿足Regex返回True否則返回False;

例1;判斷是非成都地區電話號碼合法;

分析:成都地區電話號碼組成028********,前面為固定區號028,後面滿足8位元字;

設計Regex:028\d{8}(解釋:028區號固定,後面為8個數字\d組成);

程式碼,2所示:

 

圖2 “例1” IsMatch方法是用例

(2) Replace()方法;

     Replace()方法實際上是一種替換的方法,替換匹配Regex匹配模式;

例2:在發布帶有公開電子郵件地址的文章時,替換@位AT避免產生垃圾郵件;

分析:首先需要判斷文章中電子郵箱地址,然後執行替換

設計Regex:判斷電子郵箱運算式”\w{1,}@w{1,}\\.”;

程式碼:3所示;

 

圖3 “例2”Replace方法是用例

(3) Split()方法;

     Split()方法實際上是拆分的方法,根據匹配Regex進行拆分儲存在字串數組中;

例3:從群發郵件地址中讀取所有郵件地址;

分析:群發郵件採用“;”作為分割符,需要通過“;”進行拆分

程式碼:4所示;

 

圖4 “例3”Split方法是用例

構建運算式基本方法

     構造Regex對象的建構函式包括兩個重載,一個是不含參數的構造、另外一個是含有參數的建構函式;

  • 基本形式Regex(string pattern);
  • 重載形式Regex(string pattern,RegexOptions);

    補充:RegexOptions屬於枚舉類型,包括IgnoreCase(忽略大小寫)、ReghtToLeft(從右向左)、None(預設)、CultureInvariant(忽略地區)、Multline(多行模式)和SingleLine(單行模式);

例4,建立一個合法ISBN驗證格式;

分析:ISBN格式為X-XXXXX-XXX-X;

Regex格式:\d-\d{5}-\d{3}-\d

構造該Regex函數Regex ISBNRegex = new Regex(運算式,參數為空白)

詳細代碼:5所示;

 

圖5 “例4”構造驗證函式是用例

編寫一個檢驗程式

     為了方便自己在學習Regex和快速檢驗自己編寫運算式語句是否正確,下面提供一個IsMatch()方法Regex驗證器編寫;

  1. 開啟VS.NET,選擇建立項目中的Visual C#項目的Windows應用程式,取名為“Regex_Tools”;
  2. 然後編寫6所示的介面
    圖6 RegexIsMatch方法驗證器
  3. 然後在該表單聲明中增加Regex命名空間聲明using System.Text.RegularExpressions;
  4. 編寫下列代碼
    • 編寫一段私人的判斷參數的方法,7所示;
      圖7私人驗證參數判斷方法
    • 編寫判斷按鈕的方法,8所示;
      圖8 IsMatch驗證判斷按鈕方法
    • 編寫清空按鈕的方法,所有的文字框等於空;
    • 編譯該程式,一個簡單的Regex驗證器就成功產生了;

     

     

     

    全面剖析c#Regex:

    到目前為止,許多的程式設計語言和工具都包含對Regex的支援,當然.NET也不例外,.NET基礎類庫中包含有一個名稱空間和一系列可以充分發揮規則運算式威力的類。
            Regex的知識可能是不少編程人員最煩惱的事兒了。如果你還沒有規則運算式方面的知識的話,建議從Regex的基礎知識入手。前參見 Regex文法

            下面就來研究C#中的Regex,C#中的Regex包含在.NET基礎雷庫的一個名稱空間下,這個名稱空間就是System.Text.RegularExpressions。該名稱空間包括8個類,1個枚舉,1個委託。他們分別是:
                         Capture: 包含一次匹配的結果;
                         CaptureCollection: Capture的序列;
                          Group: 一次組記錄的結果,由Capture繼承而來;
                          GroupCollection:表示擷取的群組的集合
                          Match: 一次運算式的匹配結果,由Group繼承而來;
                          MatchCollection: Match的一個序列;
                          MatchEvaluator: 執行替換操作時使用的委託;
                          Regex:編譯後的運算式的執行個體。
                          RegexCompilationInfo:提供編譯器用於將Regex編譯為獨立程式集的資訊
                          RegexOptions 提供用於設定Regex的枚舉值
    Regex類中還包含一些靜態方法:
                        Escape: 對字串中的regex中的轉義符進行轉義;
                        IsMatch: 如果運算式在字串中匹配,該方法返回一個布爾值;
                        Match: 返回Match的執行個體;
                        Matches: 返回一系列的Match的方法;
                        Replace: 用替換字串替換匹配的運算式;
                        Split: 返回一系列由運算式決定的字串;
                        Unescape:不對字串中的逸出字元轉義。

    下面介紹他們的用途:
            先看一個簡單的匹配例子,我們首先從使用Regex、Match類的簡單運算式開始學習。 Match m = Regex.Match("abracadabra", "(a|b|r)+"); 我們現在有了一個可以用於測試的Match類的執行個體,例如:if (m.Success){},如果想使用匹配的字串,可以把它轉換成一個字串:   MesaageBox.Show("Match="+m.ToString()); 這個例子可以得到如下的輸出: Match=abra。這就是匹配的字串了。

            Regex 類表示唯讀Regex類。它還包含各種靜態方法(在下面的執行個體中將逐一介紹),允許在不顯式建立其他類的執行個體的情況下使用其他Regex類。

            以下程式碼範例建立了 Regex 類的執行個體並在初始化對象時定義一個簡單的Regex。聲明一個Regex物件變數:Regex objAlphaPatt;,接著建立Regex對象的一個執行個體,並定義其規則:objAlphaPatt=new Regex("[^a-zA-Z]");

            IsMatch方法指示 Regex 建構函式中指定的Regex在輸入字串中是否找到匹配項。這是我們使用C#Regex時最常用的方法之一。下面的例子說明了IsMatch方法的使用:
    if( !objAlphaPatt.IsMatch("testisMatchMethod"))
    lblMsg.Text = "匹配成功";
    else
    lblMsg.Text = "匹配不成功";
    這段代碼執行的結果是“匹配成功”
    if( ! objAlphaPatt.IsMatch("testisMatchMethod7654298"))
    lblMsg.Text = "匹配成功";
    else
    lblMsg.Text = "匹配不成功";
    這段代碼執行的結果是“匹配不成功”

             Escape方法表示把逸出字元作為字元本身使用,而不再具有轉義作用,最小的元字元集(\、*、+、?、|、{、[、(、)、^、$、.、# 和空白)。Replace方法則是用指定的替換字串替換由Regex定義的字元模式的所有匹配項。看下面的例子,還是使用上面定義的Regex對象:objAlphaPatt.Replace("this [test] ** replace and escape" ,Regex.Escape("()"));他的返回結果是:this\(\)\(\)test\(\)\(\)\(\)\(\)\(\)replace\(\)and\(\)escape,如果不是Escape的話,則返回結果是:this()()test()()()()()replace()and()escape,Unescape 反轉由 Escape 執行的轉換,但是,Escape 無法完全反轉 Unescape。

            Split方法是把由Regex匹配項定義的位置將輸入字串拆分為一個子字串數組。例如:
    Regex r = new Regex("-"); // Split on hyphens.
    string[] s = r.Split("first-second-third");
    for(int i=0;i<s.Length;i++)
    {
    Response.Write(s[i]+"<br>");
    }

    執行的結果是:
    First
    Second
    Third

            看上去和String的Split方法一樣,但string的Split方法在由Regex而不是一組字元確定的分隔字元處拆分字串。

            Match方法是在輸入字串中搜尋Regex的匹配項,並Regex 類的 Match 方法返回 Match 對象,Match 類表示Regex匹配操作的結果。下面的例子示範Match方法的使用,並利用Match對象的Group屬性返回Group對象:

    string text = @"public string testMatchObj string s string match ";
    string pat = @"(\w+)\s+(string)";
    // Compile the regular expression.
    Regex r = new Regex(pat, RegexOptions.IgnoreCase);
    // Match the regular expression pattern against a text string.
    Match m = r.Match(text);
    int matchCount = 0;
    while (m.Success)
    {
    Response.Write("Match"+ (++matchCount) + "<br>");
    for (int i = 1; i <= 2; i++)
    {
       Group g = m.Groups[i];
       Response.Write("Group"+i+"='" + g + "'" + "<br>");
       CaptureCollection cc = g.Captures;
       for (int j = 0; j < cc.Count; j++)
       {
        Capture c = cc[j];
        Response.Write("Capture"+j+"='" + c + "', Position="+c.Index + "<br>");
       }
    }
    m = m.NextMatch();
    }

    該案例運行結果是:
    Match1
    Group1='public'
    Capture0='public', Position=0
    Group2='string'
    Capture0='string', Position=7
    Match2
    Group1='testMatchObj'
    Capture0='testMatchObj', Position=14
    Group2='string'
    Capture0='string', Position=27
    Match3
    Group1='s'
    Capture0='s', Position=34
    Group2='string'
    Capture0='string', Position=36

            MatchCollection 類表示成功的非重疊匹配的唯讀集合,MatchCollection 的執行個體是由 Regex.Matches 屬性返回的,下面的執行個體說明了通過在輸入字串中找到所有與Regex中指定的匹配並填充 MatchCollection。

    MatchCollection mc;
    Regex r = new Regex("match");
    mc = r.Matches("matchcollectionregexmatchs");
    for (int i = 0; i < mc.Count; i++)
    {
    Response.Write( mc[i].Value + " POS:" + mc[i].Index.ToString() + "<br>");
    }
    該執行個體啟動並執行結果是:
    match POS:0
    match POS:20

    聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.