C#資料結構和演算法學習系列十—-Regex

來源:互聯網
上載者:User

      所謂Regex是一種用於描述字串中字元格式設定的語言,它提供了對應於重複字元、替換符符以及分組字元的描述符。Regex既可以用來執行字串的搜尋,也可以用於字串的替換。Regex本身就是一個定義了用於其他字串搜尋模式的字串。通常情況下,Regex中的字元與其自身匹配,因此Regex“the”可以與字串中任意位置找到的同樣字元序列相匹配。Regex還可以包含稱之為元字元的特殊字元。元字元用於表示重複、替換或者分組。

1.Regex使用。為了使用Regex, 需要把RegEx 類引入程式。大家可以在System.Text.RegularExpression 名字域中找到這種類。一旦把這種類匯入了程式,就需要決定想要用RegEx 類來做什麼事情了。如果想要進行匹配,就需要使用Match 類。如果打算做替換,則不需要Match 類了。取而代之的是要用到RegEx 類的Replace 方法。
首先來看看如何在字串中進行單詞匹配操作吧。假設給定一個範例字串“the quick brown fox jumped over the lazy dog”,這裡想要在字串中找到單詞“the”。如下:

using System;using System.Text.RegularExpressions;class chapter10{    static void Main()    {        Regex reg = nNew Regex(" the");        string str1 = "the quick brown fox jumped over the lazy dog";        Match matchSet;        int matchPos;        matchSet = reg.Match(str1);        if (matchSet.Success)        {            matchPos = matchSet.Index;            Console.WriteLine("found match at position:" + matchPos);        }    }}

if 語句使用了一種Match 類的屬性Success 來確定是否是成功匹配。如果值返回為True,那麼Regex在字串中至少匹配了一條子串。否則的話,儲存在Success 中的值就是False。程式還可以有另外一種方法來查看是否匹配成功。通過把Regex和目標字串傳遞給IsMatch 方法的方式可以對Regex進行預測試。如果與Regex產生了匹配,那麼這種方法就返回True,否則返回False。如下:

if (Regex.IsMatch(str1, "the")){    Match aMatch;    aMatch = reg.Match(str1);}

用Match
類的一個問題就是它只能儲存一個匹配。在前面的執行個體中,針對子串“the”存在兩個匹配。這裡可以使用另外一種類Matches 類來儲存與Regex的多個匹配。為了處理所有找到的匹配可以把匹配儲存到MatchCollection 對象中。如下:

using System;using System.Text.RegularExpressions;class chapter10{    static void Main()    {        Regex reg = new Regex(" the");        string str1 = "the quick brown fox jumped over the lazy dog";        MatchCollection matchSet;        matchSet = reg.Matches(str1);        if (matchSet.Count > 0)            foreach (Match aMatch in matchSet)                Console.WriteLine("found a match at: " + aMatch.Index);        Console.Read();    }}

接下來要討論如何用Replace 方法把一個字串用另一個字串來替換。Replace 方法可以作為一種帶有三個參數的類方法來進行調用:一個目標字串,要替換的子串,以及用作替換的子串。如下:

string s = "the quick brown fox jumped over the brown dog";s = Regex.Replace(s, "brown", "black");

2.數量詞的用法 。在編寫Regex的時候,經常會要想Regex添加數量型資料,諸如“精確匹配兩次”或者“匹配一次或多次”。利用數量詞就可以把這些資料填加到Regex裡面了。

(1).+這個數量詞說明Regex應該匹配一個或多個緊接的字元。

(2).*這個數量詞說明Regex應該匹配零個或多個緊接的字元。

(3).?這個數量詞說明Regex應該匹配零次或一次的數量詞。

(4).{n}這個數量詞說明Regex應該匹配一個有限數量,n是要找到的匹配數量。

(5).{n,m這個數量詞說明Regex應該匹配的最大值和最小值,n 表示匹配的最小值而m 則表示最大值。

簡單一實例如下:

using System;using System.Text.RegularExpressions;class chapter10{    static void Main()    {        string[] words = new string[] {" bad", "boy", "baad","baaad", "bear", "bend"};        foreach (string word in words)            if (Regex.IsMatch(word, "ba{2} d"))                Console.WriteLine(word);    }}

 3.字元類的使用。字元類可以用多組字元構成。如果想要既匹配小寫字母也匹配大寫字母,那麼可以把Regex寫成這樣:“[A-Za-z]”。當然,如果需要包括全部十個數字,也可以編寫像[0-9]這樣由數字組成的字元類。此外,通過在字元類前面放置一個脫字元號(^)的方法人們還可以建立字元類的反或者字元類的否定。例如,如果有字元類[aeiou]來表示母音類,那麼就可以編寫[^aeiou]來表示輔音或非母音。如果把這三個字元類合并,就可以形成Regex用法中所謂的單詞。Regex就像這個樣子:[A-Za-z0-9]。這裡還有一個可以用來表示同樣類的較短小的字元類:\w。\W
用來表示\w 的反,也或者用來表示非單詞字元(比如標點符號)。此外,還可以把數字字元類([0-9])寫成\d(注意由於在C#語言中反斜杆後跟著其他字元很可能是逸出序列,所以諸如\d 這樣的代碼在C#語言中都以
\\d 形式來說明Regex而非轉義代碼)。而非數字字元類([^0-9])則可以寫成\D
這樣。最後,因為空白格符在文本處理中扮演著非常重要的角色,所以把\s 用來表示空白字元,而把\S 用來表示非空白字元。

 

總結:Regex在大多數情況下可以快速的實現尋找和替換,不過要對他們的運用做到很熟悉的話,主要是一個日積月累的過程,用得多了,自然就得心應手了。

相關文章

聯繫我們

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