所謂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在大多數情況下可以快速的實現尋找和替換,不過要對他們的運用做到很熟悉的話,主要是一個日積月累的過程,用得多了,自然就得心應手了。