C#語言之字符串和正則表達式
來自: http://www.cnblogs.com/liter7/p/5175012.html
本文將完成以下兩個目標:
一、創建字符串;
二、正則表達式;
首先,我先來介紹一下System.String類:
System.String是一個類,專門用于存儲字符串,允許對字符串進行許多操作。
使用運算符重載可以連接字符串:
string str1 = "hello"; //return "hello" str1 +=",C#"; //return "hello,C#" string str2 = str1+"!"; //return "hello,C#!"
C#還允許類似于索引器的語法來提取指定的字符:
string s = "hello"; char ch = s[4]; //索引從0開始 Console.WriteLine(ch); //輸出為o
另外,String類中還有許多實用的方法,例如:
Compare方法:比較字符串的內容,判斷某些字符是否相等
返回參數:
大于0:s1大于s2;
等于0:s1等于s2;
小于0:s1小于s2;
string s1 = "hello"; string s2 = "hello"; int i = String.Compare(s1, s2); //比較字符串的位置,此用法為String類調用的方法,參數為兩個字符串,如果僅比較兩個字符串是否相等,可以用s1.Equlas(s2)方法實現 Console.WriteLine(i); //輸出 0()
Split方法:在出現給定字符串的地方,把字符串分割為一個字符串數組
string s1 = "hello"; string[] s3= s1.Split('e'); foreach (string s in s3) { Console.WriteLine(s); //輸出為 h // llo }
Substring方法:在字符串中檢索給定位置的子字符串
string s1 = "hello"; string s3= s1.Substring(0,3); //第一個參數為從索引為幾開始,第二個參數為取多長 Console.WriteLine(s3); //輸出為 hel
這個方法有好多參數,具體用法可以自己用VS查看一下。打出這個方法之后,參數會自動提示。
ToLower方法:把字符串轉化為小寫
ToUpper方法:把字符串轉化為大寫
Trim方法:在輸入數據時比較實用,可以刪除首尾的空格,以便與數據庫內容匹配。
此外,還有許許多多的方法很實用,如果用得到,可以參考String類的中文文檔。
一、創建字符串:
我們來說一下為什么我們要創建字符串,前面我們已經說到了,表面上str1可以通過運算符重載的方式在原本字符串的內容上修改或追加內容,但其實并非如此,因為字符串是不可變的,一個字符串對象一旦創建,值就不能再更改(在不使用不安全代碼的情況下)。其實本質上是創建一個新的字符串,將最初的文本復制到這個新的字符串中,再加上額外的文本,然后更新存儲在變量str1的地址,使變量正確的指向新的字符串對象,其實這本身并沒有什么,但是如果我們要對字符串做大量的修改操作,這將大大降低性能和效率。例如,假定要對一個很長的字符串編碼,在字母表中,用Ascii碼靠后的字符替代其中的每個字母(標點符號除外),作為非常簡單的加密模式的一部分。完成這個任務的方式有好幾種,最簡單最高效的一種是(假定使用String類):使用String.Replace()方法,該方法把字符串中指定的子字符串用另一個字符串替換。使用該方法時將創建非常多的字符串對象。如此,如果使用字符串頻繁的進行文字處理,應用程序將會遇到嚴重的性能問題。
為了解決這類問題,C#改為使用System.Text.StringBuilder類,StringBuilder類中的方法很少,僅限于處理替換和追加或刪除字符串中的文本,但是,他的工作效率非常高。
StringBuilder的主要方法如下:
Append方法:給當前字符串追加一個字符串
AppendFormat方法:追加特定格式的字符串
Insert方法:在當前字符串中插入一個字符串
Remove方法:從當前字符串中刪除字符
Replace方法:在當前字符串中,用某個字符 全部替換 另一個字符,或者用一個子字符串 全部替換 另一個字符串。
ToString方法:返回當前強制轉換為System.String對象的字符串
Remove和Replace的例子:其他的例子大家可以嘗試一下。
StringBuilder sb = new StringBuilder("lalala"); sb.Replace('a', 'g'); //用字符g替換a Console.WriteLine(sb.ToString()); //輸出 lglglg sb.Remove(0,5); //從索引0開始,刪除5個字符 Console.WriteLine(sb.ToString()); //輸出 a
二、正則表達式
正則表達式語言是一種專門用于字符串處理的語言。 它包含兩個功能:
- 一組用于標識字符類型的轉義代碼。例如,* 代表任意字符串。
- 一個系統,在搜索操作中,它把子字符串和中間結果的各個部分組合起來。
使用正則表達式,可以對字符串執行許多復雜而高級的操作,例如 :
- 識別(標記或刪除)字符串中所有重復的單詞
- 等等......
我們先來看一下所有的正則表達式模式:
1.字符轉義:
2.字符類
3.定位點
4.分組構造
5.限定符
6.反向引用構造
7.替換構造
8.替換
9.其他構造
當我們需要哪些模塊時,我們可以再去參考,詳細的模塊例子請參考msdn幫助文檔。
使用方法 :
使用正則表達式處理文本的中心構件是 正則表達式引擎 ,該引擎在 .NET Framework 中由 System.Text.RegularExpressions . Regex 對象表示。
因此,我們先來看一看Regex的相關知識。
我們需要匹配,捕獲和組合。Regex通過Group類和 Capture類支持組和捕獲。GroupCollection類和CaptureCollection類分別表示組和捕獲的集合,Match類提供一個Groups屬性,他返回相應的GroupCollection對象。Group類也相應的實現了一個Capture屬性,該屬性返回CaptureCollection對象,這些對象之間的關系如下圖:
以下為查找我們所需要字符串的實例代碼
//要匹配的文本 string text = "One car red car blue car";//匹配的規則:匹配一個或多個單詞為一組(小括號內為一組), //然后匹配一個或多個空白字符 //最后匹配一個car字符串為一組,最后組合為規則所需。 string pat = @"(\w+)\s+(car)"; //實例化r,第二個參數為匹配的要求,這里為忽略大小寫 Regex r = new Regex(pat, RegexOptions.IgnoreCase); //這里還可以寫成這樣 //MatchCollection mc = r.Matches(text); //然后用下標的形式訪問每個mc,返回一個匹配的結果 //Match m = mc[i]; Match m = r.Match(text); int matchCount = 0; //此屬性判斷是否匹配成功 while (m.Success) { //匹配的個數 Console.WriteLine("Match" + (++matchCount)); //這里為什么要從下標1開始,因為下面獲取組時: //下標0為一個整組,是根據匹配規則“(\w+)\s+(car)”獲取的整組 //下標1為第一個小括號里面的數據 //下標2為第二個括號里面的數據....依次論推 for (int i = 1; i <= 2; i++) { //獲取由正則表達式匹配的組的集合,這行代碼相當于下面兩句 //GroupCollection gc = mt.Groups; //Group g = gc[i]; Group g = m.Groups[i]; //輸出 Console.WriteLine("Group" + i + "='" + g + "'"); //獲取由捕獲組匹配的所有捕獲的集合 CaptureCollection cc = g.Captures; for (int j = 0; j < cc.Count; j++) { Capture c = cc[j]; System.Console.WriteLine("Capture" + j + "='" + c + "', Position=" + c.Index); } } //匹配下一個 m = m.NextMatch(); } </pre>
輸出結果為:
Match1
Group1='One'
Capture0='One', Position=0
Group2='car'
Capture0='car', Position=4
Match2
Group1='red'
Capture0='red', Position=8
Group2='car'
Capture0='car', Position=12
Match3
Group1='blue'
Capture0='blue', Position=16
Group2='car'
Capture0='car', Position=21
構造函數:
![]()
這里可以根據實際需要實例化某個方法。
一個判讀是否匹配的方法:
IsMatch方法:此方法的可選參數有好多,主要作用是 指示所指定的正則表達式在指定的輸入字符串中是否找到了匹配項。
string[] s = {"hello world !","This is a C# language"}; Regex rg = new Regex("ll"); foreach (string ss in s) { Console.WriteLine("{0} 里面{1}字符串ll .", ss, rg.IsMatch(ss) ? "匹配到" : "沒匹配到"); }顯示結果為:
hello world ! 里面匹配到字符串ll .
This is a C# language 里面沒匹配到字符串ll .