天天看點

正規表達式1   正規表達式工作方式2   正規表達式對象模型3   正規表達式語言4   參考

         一種十分強大的處理文本資訊的工具。

         正規表達式提供功能強大、用法靈活以及高效處理文本的方法,正規表達式的全面模式比對表示法使您可以快速分析大量文本以找到特定的字元模式;驗證文本以確定它比對預定義的模式(如電子郵件位址);提取、編輯、替換或删除文本子字元串;将提取的字元串添加到集合以生成報告。

1   正規表達式工作方式

         在以前的認知中,對于文本的處理,基本可以歸為對字元串的處理,而對字元串的處理一般有查找、替換(插入是特殊的替換)和取子字元串,而完成這些功能的最終方法就是比較字元串是否相同。現在有了正規表達式這個進階工具,它的進階之處在于可以定義通配字元串,即用來比對的字元串的一般形式,比如用\d 表示十進制數字,并且将用來完成比對功能的若幹函數,全部定義到 Regex 類中,由其統一處理比對的若幹事宜。

         将統一處理比對的類稱為正規表達式引擎,在使用時需要提供兩個資訊,可以了解為接收兩個參數來完成初始化。一個是前面提到的通用比對字元串,一個是要比對的文本。

         正規表達式引擎中若幹種方法,可以歸納為以下幾種功能:

         (1)通過調用 IsMatch方法确定輸入文本中是否具有正規表達式模式比對項。

         (2)通過調用 Match 或 Matches 方法檢索比對正規表達式模式的一個或所有文本比對項。

         (3)通過調用 Replace方法替換比對正規表達式模式的文本。

         以下使用一個簡單示例用以說明如何使用正規表達式,及其如何工作。其首先定義并執行個體化通用比對字元串 pattern,然後給出了用來比對的文本 names 字元串數組,接着調用靜态 Replace 方法,便實作了将姓名前的稱呼字元串去除,程式如下。

public class Example
{
   public static void Main()
   {
      string pattern = "(Mr\\.? |Mrs\\.? |Miss |Ms\\.? )";
      string[] names = { "Mr. Henry Hunt", "Ms. Sara Samuels", 
                         "Abraham Adams", "Ms. Nicole Norris" };
      foreach (string name in names)
         Console.WriteLine(Regex.Replace(name, pattern, String.Empty));
   }
}
           

         輸出結果如下。

Henry Hunt

Sara Samuels

Abraham Adams

Nicole Norris

2   正規表達式對象模型

         在學習面向對象之前,處理比對的方式不外乎方法調用。由于 C# 是面向對象的,其自然也将面向對象的思想引入至正規表達式。

         在叙述正規表達式對象模型之前,得先介紹捕獲組這個概念,捕獲組是相對于通用比對字元串提出的,在通用比對字元串中使用小括号将其中的一些字元括起來成為一個捕獲組。可以這樣形象的了解,首先用整個通用比對字元串進行比對,然後接着使用捕獲組進行比對,也就是說有人為了偷懶将多條通用比對字元串寫到一條中,前提是這一條包含其它的幾條,而且使用小括号作為标記符,用以說明這是一組。

         使用 Regex 類的 Match 方法進行單個正規表達式比對,比對傳回 Match 類型對象;

         如果該該正規表達式可以進行多次比對,那麼将會有多個 Match 類型對象傳回,于是使用MatchCollection 類型對象儲存多個 Match 類型對象,即MatchCollection 類型對象作為單個Match 類型對象的集合,可以使用Regex 類的Matchs 方法傳回MatchCollection 類型對象;

         由于當個正規表達式中存在捕獲組(可以看作小的單個正規表達式),在正規表達式進行比對時,捕獲組也會進行比對,于是使用Match 類的Group 類型對象存儲;

         在這裡為了後續工作的友善進行,定義了同 Group 類型功能相同的Group 類的Capture 類型,用以存儲捕獲組的一次比對;

         同理,捕獲組也可能進行多次比對,其結果則使用 CaptureCollection 類型存儲;

         又如,捕獲組可能有多組,其結果則使用 GroupCollection 類型存儲,相應的可以使用Match.Groups 屬性傳回GroupCollection 類型對象。

         最後對于,Match 類的 Group 類型是存儲與 Capture類型相同的對象,但如果某個捕獲組有多次捕獲,則将最後一次捕獲結果放在Group 類型中,具體對應程式是match.Groups[0].Value表示的值。

         可以參考圖1進行了解,其中名稱基本是去類或方法單層首字母,雙箭頭表傳回類型,單箭頭指向該類型的上一層結構(就是該類型的集合),等号表其至少在功能上是等價的或可以存儲同一類型的值。

正規表達式1   正規表達式工作方式2   正規表達式對象模型3   正規表達式語言4   參考

圖1 對象模型執行個體

         程式示例如下。

static void Main(string[] args)
        {
            string pattern;
            string input = "abcd||aababcabcd";

            // Match a word with a pattern that has no capturing groups.
            pattern = @"((((a)+b)+c)+d)+";

            foreach (Match match in Regex.Matches(input, pattern))
            {
                Console.WriteLine("{0} {1}", match.Value, match.Groups.Count);
                for (int groupCtr = 0; groupCtr < match.Groups.Count; groupCtr++)
                { 
                    Console.WriteLine("    Group {0}: '{1}'", groupCtr, match.Groups[groupCtr].Value);
                    Console.WriteLine("    Group({0}).Captures: {1}",
                              groupCtr, match.Groups[groupCtr].Captures.Count);
                    for (int captureCtr = 0; captureCtr < match.Groups[groupCtr].Captures.Count; captureCtr++)
                        Console.WriteLine("      Capture {0}: '{1}'", captureCtr, match.Groups[groupCtr].Captures[captureCtr].Value);
                }

            }           
        }
           

         程式結果如下。

abcd 5

   Group 0: 'abcd'

   Group(0).Captures: 1

     Capture 0: 'abcd'

   Group 1: 'abcd'

   Group(1).Captures: 1

     Capture 0: 'abcd'

   Group 2: 'abc'

   Group(2).Captures: 1

     Capture 0: 'abc'

   Group 3: 'ab'

   Group(3).Captures: 1

     Capture 0: 'ab'

   Group 4: 'a'

   Group(4).Captures: 1

     Capture 0: 'a'

aababcabcd 5

   Group 0: 'aababcabcd'

   Group(0).Captures: 1

     Capture 0: 'aababcabcd'

   Group 1: 'aababcabcd'

   Group(1).Captures: 1

     Capture 0: 'aababcabcd'

   Group 2: 'abc'

   Group(2).Captures: 2

     Capture 0: 'aababc'

     Capture 1: 'abc'

   Group 3: 'ab'

   Group(3).Captures: 3

     Capture 0: 'aab'

     Capture 1: 'ab'

     Capture 2: 'ab'

   Group 4: 'a'

   Group(4).Captures: 4

     Capture 0: 'a'

     Capture 1: 'a'

     Capture 2: 'a'

     Capture 3: 'a'

         該正規表達式成功的執行了兩次比對,傳回了兩個 Match對象;在每個 Match 對象中包含5個 Group 對象,對應每個 Group 對象有若幹幹相應的 Capture 對象;其中第1個(零下标處)Group 放置最後一次捕獲的Group 對象。

3   正規表達式語言

         正規表達式語言包含以下部分。

         字元轉義:正規表達式中的反斜杠字元(\)訓示其後跟的字元是特殊字元,或應按原義解釋該字元。

         如\a與報警 (bell) 符 \u0007 比對。\b在字元類中,與倒退鍵\u0008 比對。

         字元類:字元類與一組字元中的任何一個字元比對。

         如\s與任何空白字元比對。\d與任何十進制數字比對。

         定位點:定位點或原子零寬度斷言會使比對成功或失敗,具體取決于字元串中的目前位置,但它們不會使引擎在字元串中前進或使用字元。

         如^比對必須從字元串或一行的開頭開始。\A比對必須出現在字元串的開頭。

         分組構造:分組構造描述了正規表達式的子表達式,通常用于捕獲輸入字元串的子字元串。

         如(subexpression)捕獲比對的子表達式并将其配置設定到一個從零開始的序号中。

         限定符:限定符指定在輸入字元串中必須存在上一個元素(可以是字元、組或字元類)的多少個執行個體才能出現比對項。

         如*比對上一個元素零次或多次。+比對上一個元素一次或多次。

         反向引用構造:反向引用允許在同一正規表達式中随後辨別以前比對的子表達式。

         如\ number後向引用。 比對編号子表達式的值。

         替換構造:替換構造用于修改正規表達式以啟用 either/or 比對。

         替換:替換是替換模式中支援的正規表達式語言元素。

         正規表達式選項:可以指定控制正規表達式引擎如何解釋正規表達式模式的選項。

         其他構造:其他構造可修改某個正規表達式模式或提供有關該模式的資訊。

         有關更加詳細的叙述,可以檢視 C# 程式設計指南。

4   參考

C# 程式設計指南

C# 自學手冊

http://blog.csdn.net/chenanlin1981/article/details/845761