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