天天看點

全面剖析C#正規表達式

摘要:

正規表達式對初學者來說,往往是一種神秘的東西,實際上,仔細研究一下也就是那麼回事兒,沒有多麼的難。希望這篇文章對你有所幫助。

-

        到目前為止,許多的程式設計語言和工具都包含對正規表達式的支援,當然.NET也不例外,.NET基礎類庫中包含有一個名稱空間和一系列可以充分發揮規則表達式威力的類。 

        正規表達式的知識可能是不少程式設計人員最煩惱的事兒了。如果你還沒有規則表達式方面的知識的話,建議從正規表達式的基礎知識入手。

        下面就來研究C#中的正規表達式,C#中的正規表達式包含在.NET基礎雷庫的一個名稱空間下,這個名稱空間就是System.Text.RegularExpressions。該名稱空間包括8個類,1個枚舉,1個委托。他們分别是:

                     Capture: 包含一次比對的結果; 

                     CaptureCollection: Capture的序列; 

                     Group: 一次組記錄的結果,由Capture繼承而來; 

                     GroupCollection:表示捕獲組的集合

                     Match: 一次表達式的比對結果,由Group繼承而來; 

                     MatchCollection: Match的一個序列; 

                     MatchEvaluator: 執行替換操作時使用的委托; 

                     Regex:編譯後的表達式的執行個體。 

                     RegexCompilationInfo:提供編譯器用于将正規表達式編譯為獨立程式集的資訊

                     RegexOptions 提供用于設定正規表達式的枚舉值

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 objAlphaPatt;,接着建立Regex對象的一個執行個體,并定義其規則:objAlphaPatt=new Regex("[^a-zA-Z]");

        IsMatch方法訓示 Regex 構造函數中指定的正規表達式在輸入字元串中是否找到比對項。這是我們使用C#正規表達式時最常用的方法之一。下面的例子說明了IsMatch方法的使用:

if( !objAlphaPatt.IsMatch("testisMatchMethod"))

 lblMsg.Text = "比對成功";

else

 lblMsg.Text = "比對不成功";

這段代碼執行的結果是“比對成功”

if( ! objAlphaPatt.IsMatch("testisMatchMethod7654298"))

這段代碼執行的結果是“比對不成功”

         Escape方法表示把轉義字元作為字元本身使用,而不再具有轉義作用,最小的元字元集(、*、+、?、|、{、[、(、)、^、$、.、# 和空白)。Replace方法則是用指定的替換字元串替換由正規表達式定義的字元模式的所有比對項。看下面的例子,還是使用上面定義的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 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方法在由正規表達式而不是一組字元确定的分隔符處拆分字元串。

        Match方法是在輸入字元串中搜尋正規表達式的比對項,并Regex 類的 Match 方法傳回 Match 對象,Match 類表示正規表達式比對操作的結果。下面的例子示範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

Capture0='string', Position=27

Match3

Group1='s'

Capture0='s', Position=34

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

本文轉自左洸部落格園部落格,原文連結:http://www.cnblogs.com/myqiao/archive/2006/12/04/582028.html,如需轉載請自行聯系原作者

繼續閱讀