[.net]Regex整理

來源:互聯網
上載者:User
Regex在處理字串方面具有強大的優勢,所以整理了一下主要的知識點,希望對大家有所協助。通過這篇文章我們能夠理清Match,Group,Capture的區別和聯絡。(如果您已經清楚,則沒有讀下去的必要了:p)

.net下Regex處於System.Text.RegularExpression 命名空間下,主要由幾個類構成:Regex,Match,Group,Capture。

Regex表示唯讀Regex類,它包含很多靜態方法用於匹配,是我們調用Regex的起點。Match方法的介紹留到後面,這裡先介紹一下Regex.Replace方法,應用該方法可以快捷的替換字串。該方法有多個重載的列表,其中比較常用的有2個,一個是 Replace(string, string, string),最後一個string可以用"$1,2"等來表示用捕獲的分組替換原來的字串,例如string s = Regex.Replace(" abra ddd ", @"^\s*(.*?)\s(.*?)\s*$", "$2");則返回的是該輸入的第二個分組的內容"ddd",關於分組看下面的match介紹。還有一個是Replace(string,MatchEvaluator),其中MatchEvaluator是一個簽名為string (Match)的委託,那麼我們就可以通過定義一個委託方法,來處理返回字串。

Match表示匹配操作的結果。它返回通過Regex在輸入串中匹配到的第一個結果。例如以abc(正則)匹配123abc456abc(輸入),則會得到2個Match。所以我們直接調用Regex r = new Regex("abc");Match m = r.Match("123abc456abc");則返回的m只有第一個abc,所以如果我們想得到第一個匹配時可以調用一次Match就可以了。如果我們想遍曆所有的匹配,則需要使用Matches方法返回MatchCollection來遍曆,或者用Match方法做一個迴圈。例如MatchCollection mathes =r.Matches(……);或者while(m.Success){……;m = m.NextMatch();}

當然我們不會唯寫這麼簡單的Regex,很多時候需要做一些分組來方便字串的處理,這就用到了Group和GroupCollection。我們在用Regex進行匹配時,始終預設整個Regex作為第一個分組(Group),例如"a((b)c)",就包含3個Group:abc,bc,b(從左至右),這3個Group構成了這個Match的GroupCollection。由於Regex的元字元的原因,每個Group又可能包含若干個捕獲(Capture),例如用"(abc)+"匹配"abcabcabcddd"時,就得到2個Group,第一個是預設的整個Regex匹配的分組(abcabcabc),由於整個運算式預設執行的是貪婪匹配,所以匹配了最多可能的abc串,所以這個group只有一個capture。第二個Group是用分組"(abc)+"來捕獲的,由於存在3個abc所以他捕獲了3個Capture,分別為3個abc。直接存取Group.Value,返回的則是該組最後一個Capture的值。

舉例:通過這個例子可以熟悉怎麼讀取匹配的結果。例子程式
Regex r = new Regex("(Abc)+");
            Match m = r.Match("XYZAbcAbcAbcXYZAbcAb");            

            //輸出分組的個數
            Console.WriteLine("Captured groups = " + m.Groups.Count.ToString());

            // 在分組中迴圈
            for (int i = 0; i < m.Groups.Count; i++)
            {
                CaptureCollection cc = m.Groups[i].Captures;

                // 輸出當前分組捕獲的個數
                Console.WriteLine("Captures count = " + cc.Count.ToString());

                // 在捕獲中迴圈
                for (int ii = 0; ii < cc.Count; ii++)
                {
                    // 輸出捕獲的位置
                    Console.WriteLine(cc[ii] + "   Starts at character " + cc[ii].Index);
                }
            }

將會產生如下輸出:
Captured groups = 2
Captures count = 1
AbcAbcAbc   Starts at character 3
Captures count = 3
Abc   Starts at character 3
Abc   Starts at character 6
Abc   Starts at character 9

附錄:
Regex測試載入器:http://regulator.sourceforge.net/
關於Regex的寫法:http://www.cnblogs.com/mancini/archive/2005/03/21/122819.html

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.