c#基礎語言編程-正則表達式應用

引言
在不同語言中雖正則表達式一樣,但應用函數還是有所區別,在c#語言中使用Regex。
可以通過以下兩種方式之一使用正則表達式引擎:

  • 通過調用 Regex 類的靜態方法。 方法參數包含輸入字符串和正則表達式模式。 正則表達式引擎會緩存靜態方法調用中使用的正則表達式,這樣一來,重複調用使用同一正則表達式的靜態正則表達式方法將提供相對良好的性能。
  • 通過實例化 Regex 對象,採用的方式是將一個正則表達式傳遞給類構造函數。 在此情況下,Regex 對象是不可變的(只讀),它表示一個與單個正則表達式緊密耦合的正則表達式引擎。 由於未對 Regex 實例使用的正則表達式進行緩存,因此不應使用同一正則表達式實例化 Regex 對象多次。
  • 可以調用 Regex 類的方法來執行下列操作:
    確定字符串是否與正則表達式模式匹配。(ismatch)
    提取單個匹配項或第一個匹配項。(match)
    提取所有匹配項。(matches)
    替換匹配的子字符串。(replace)
    將單個字符串拆分成一個字符串數組。(replace)
    匹配正則表達式模式
    如果字符串與模式匹配,則 Regex.IsMatch 方法返回 true;如果字符串與模式不匹配,則此方法返回 false。
string[] values = { "111-22-3333", "111-2-3333"};
 string pattern = @"^\d{3}-\d{2}-\d{4}$";
 foreach (string value in values)
  {
   if (Regex.IsMatch(value, pattern))
   Console.WriteLine("{0} is a valid SSN.", value);
   else   
     Console.WriteLine("{0}: Invalid", value);
  }

111-22-3333 is a valid SSN.
111-2-3333: Invalid
IsMatch()這個函數驗證指定的字符串是否匹配指定的正則表達式,但是注意:
默認情況下,如果在整個字符串中只要有一部分匹配給定的字符串則返回true
一般情況下,當調用IsMatch()函數的時候都希望是完全匹配,所以在寫正則的時候兩邊都要加^與$
正則表達式重點是在總結字符規律,注意元字符的使用還有轉義字符。
提取單個匹配項或第一個匹配項
Regex.Match 方法返回一個 Match 對象,該對象包含有關與正則表達式模式匹配的第一個子字符串的信息。

string msg = "大家好呀,hello,2010年10月10日是個好日子。恩,9494";
//逐個提取
//字符串提取Match()和Matches()
 //提取第一個匹配的字符串,只提取一個。
   Match match = Regex.Match(msg, @"\d+",          RegexOptions.ECMAScript);
   Console.WriteLine(match.Value);
   Console.ReadLine();

只輸出2010,如果想輸出全部數字,用matches。
提取所有匹配項
Regex.Matches 方法返回一個 MatchCollection 對象,該對象包含有關正則表達式引擎在輸入字符串中找到的所有匹配項的信息。

 string msg = "大夫,我咳嗽得很重。”     大夫:“你多大年記?”     患者:“七十五歲。”     大夫:“二十歲咳嗽嗎”患者:“不咳嗽。?";
MatchCollection matches = Regex.Matches(msg, "咳嗽");
foreach (Match item in matches)
 {
     Console.WriteLine(item.Index);
 }
 Console.WriteLine("一共出現了{0}", matches.Count);

輸出3,返回的是一個集合,然後在裏面逐一提取。
在捕獲內容時,還有捕獲組的概念,就是用括號進行表示。先寫一個能滿足整個字符串的正則表達式,然後在正則表達式中用括號將那些你想要提取的內容括起來,這樣就可以提取你想要的組了。

string msg = "June26,1951    ";
Match match = Regex.Match(msg, @"^([a-zA-Z]+)\s*(\d{1,2})\s*,\s*(\d{4})\s*$");
Console.WriteLine(match.Groups[1].Value);
Console.WriteLine(match.Groups[2].Value);
Console.WriteLine(match.Groups[3].Value);

這樣就能在全部匹配的情況下,分別獲取了june 26 1951

貪婪模式
正則表達式會儘可能多的找到匹配,這就是正則表達式的貪婪模式。
終止貪婪模式: ? 具有終止貪婪模式的功能。當?出現在了另外一個限定符後的時候,表示終止貪婪模式。終止貪婪模式,表示,儘可能少的去匹配,則只匹配一個。

 string msg = "1111。11。111。111111。";
 //結果是全部字符串
 Match match = Regex.Match(msg, "(.+)(。)");
 //結果是1111。如果沒有。就是1,匹配時他要儘可能匹配。
 Match match = Regex.Match(msg, ".+?。");
Console.WriteLine(match.Value);

替換匹配的子字符串
Regex.Replace 方法會將與正則表達式模式匹配的每個子字符串替換爲指定的字符串或正則表達式模式,並返回進行了替換的整個輸入字符串。

string msg = "我的生日是05/21/2010耶我的生日是03/11/2000耶我的生日是05/21/2010耶我的生日是05/21/2010耶";
//在替換的方法中,使用提取組。 注意在引用分組的時候是使用  $1$2、.....
msg = Regex.Replace(msg, @"(\d{2})/(\d{2})/(\d{4})", "$3-$1-$2");

反向引用
捕獲組捕獲到的內容,不僅可以在正則表達式外部通過程序進行引用,也可以在正則表達式內部進行引用,這種引用方式就是反向引用。反向引用的作用通常是用來查找或限定重複、查找或限定指定標識配對出現等等。在正則表達式內部,要引用內部的分組,則使用\1 \2 \3 \4 等來引用分組。
對於普通捕獲組的反向引用,是通過捕獲組的編號來實現的。([ab])\10
這裏的“\10”會被解析成第10個捕獲組的反向引用。

string msg = "你你你好好好好好好媽媽媽媽媽媽媽媽";
msg = Regex.Replace(msg, @"(.)\1+", "$1");

這個輸出結果是“你好媽”,正則表達式表示含義時,找到一個字符以他未引用出現多次的進行替換,替換爲反向引用的內容。
上述代碼中使用了提取組的概念。
提取組:先寫一個能滿足整個字符串的正則表達式,然後在正則表達式 中用括號將那些想要的內容進行提取內容括起來。
小括號從左邊開始數,第一個小括號就是第一組,第二個小括號就是第二組,
只數左邊的括號。如沒有,直接返回null。
在正則表達式應用中就是匹配、提取、替換,當然還有這幾個應用的組合,要靈活應用。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章