- Visual C# 2008開發技術詳解
- 李容等編著
- 133字
- 2018-12-27 11:19:40
第4章 字符串處理
字符串是C#中應用較廣的一個概念,它作為C#中最為常見的數據處理類型之一,能和其他數據類型進行相互轉化。.NET Framework中有兩個用于字符串處理的基本類——String類和StringBuilder類。本章從這兩個類開始,陸續介紹字符串的一些相關操作。
4.1 字符串的常用功能
本節主要介紹字符串操作的一些常用功能,包括字符串的比較、字符串的格式化,以及字符串的大小寫轉化和字符串的拆分和與截取等。
4.1.1 字符串的比較
String類包含在命名空間System中,它提供了一些實現字符串相互比較的方法,如表4-1所示。
表4-1 字符串比較的方法列表

下面以Compare()為例,舉一個相關例子。打開VS2008,在D:\C#\ch4目錄下面建立名為StringCompareTest的控制臺運用程序,向Main()函數中添加如下代碼。
System.String s1 = "5555"; String s2 = "2222"; int r = String.Compare(s1, s2); //比較兩個字符串的大小,如果s1>s2,,則返回值為1, //如果s1=s2,則返回值為0,如果s1<s2,則返回值為-1 Console.WriteLine(r); Console.ReadKey();
運行結果如圖4-1所示。

圖4-1 運行結果
由上可知,String.Compare()返回的是整數0,1或-1中的一個整數,CompareOrditional()和CompareTo()返回的也是整型數據,但Equals()返回的是Bool型數據,讀者在使用的時候應該注意。
4.1.2 字符串的格式化
在日常應用中,單一的字符串形式常常難以滿足要求。比如需要的字符串可能是一種貨幣格式,或者需要科學計數,或者需要用%形式進行表示,此時,就需要對字符串進行格式化。String類提供了一些能進行字符串格式化的特殊參數,下面以例子進行說明。
float sdr=5.335555f; Console.WriteLine(sdr.ToString("F4")); //保存到小數點后面4位小數,運行結果5.3356 Console.WriteLine(sdr.ToString("p")); //以百分比的形式保存,運行結果533.56% int sdg = 234533; Console.WriteLine(sdg.ToString("x")); //轉化為16進制,運行結果929 Console.WriteLine(sdg.ToString("E")); //科學計數法,運行結果2.4533E+005 Console.WriteLine(sdg.ToString("c")); //貨幣形式,運行結果¥234,533.00
這僅僅是字符串格式化中的一部分,如果讀者有需要,可查閱相關文獻。
4.1.3 字符串的大小寫轉換
任何語言都有對字符串的大小寫轉化的相應函數,C#也不例外。主要是String類的兩個非靜態方法ToUpper()和ToLower()。如下面的例子。
string s1 = "aaaaa"; string s2= s1.ToUpper(); //轉化為大寫輸出 Console.WriteLine(s2); Console.ReadKey();
運行結果如圖4-2所示。

圖4-2 運行結果
4.1.4 字符串的拆分與截取
字符串的拆分最常用的方法是Split()方法,截取常用SubString()屬性,為了更清楚地說明它們的用法,還是用例子進行說明。
打開VS2008,在D:\C#\ch4目錄下新建名為StringSepTest的控制臺應用程序,在Main()函數里添加如下代碼。
string s1 = "aaaa, bbbb, cccc, dddd, eeee"; string[] s2 = null; s2 = s1.Split(' , ' ) ; //以“, ”為分隔符拆分s1,把結果放在字符串數組s2中 for (int i = 0; i < 5; i++) { Console.WriteLine(s2[i]); Console.WriteLine(s2[i].Substring(0, 2)); //截取字符串的前兩位 } Console.ReadKey();
程序運行結果如圖4-3所示。

圖4-3 運行結果
4.2 StringBuilder類
StringBuiler類與String類的基本功能大致相同,但StringBuiler類更具優勢。比如對一個已經被申明的字符串再添加數據時,String類必須新開辟一個字符串對象,而StringBuiler類卻可以直接添加,下面將詳細說明。
4.2.1 字符串對象的追加
下面看一個關于追加字符串的例子,打開VS2008,在D:\C#\ch4目錄下建立一個名為StringBuilderTest的控制臺應用程序,在Main()函數下面添加如下代碼。
StringBuilder sb = new StringBuilder("C# is a good language"); sb.Append(" ok I will try my best to study it"); Console.WriteLine(sb); Console.ReadKey();
運行結果如圖4-4所示。

圖4-4 運行結果
通過StringBuilder類實例化的一個字符串對象,可以輕松地在后面添加一串字符,而不用重新開辟一個新的對象來存儲更長的字符串。
4.2.2 字符串的插入、刪除與替換
打開VS2008,在D:\C#\ch4目錄下建立一個名為StringBuilderInsertTest的控制臺應用程序,在Main()函數下面添加如下代碼。
StringBuilder sb = new StringBuilder(); sb.Append("aaaa"); //追加字符串aaaa sb.Insert(1, "ssss"); //在第一個a后面添加字符串ssss Console.WriteLine(sb); sb.Replace(' s' , ' b' ); //將字符s替換為b Console.WriteLine(sb); sb.Remove(2, 2); //從索引值為2的地方開始刪除兩個字符 Console.WriteLine(sb); Console.ReadKey();
程序運行結果如圖4-5所示。

圖4-5 運行結果
至此,介紹了一些字符串的常用基本操作,在下面的章節中將介紹字符串應用中的一個難點,也是一個常用點——正則表達式。
4.3 正則表達式
正則表達式是驗證領域的重要的知識點,.NET Framework中對其提供了很好的支持,本節將對其相關知識進行介紹。
4.3.1 System.Text.RegularExpression命名空間
RegularExpression命名空間包含一些類,這些類能訪問.NET Framework的正則表達式引擎。該命名空間能提供正則表達式功能。該命名空間的常見類如表4-2所示。
表4-2 RegularExpression命名空間的類

接著再說明該命名空間中的一個枚舉——RegexOption,它用于提供設置正則表達式選項的枚舉值。以上只是個關于RegularExpression命名空間的大致介紹,讀者可能會覺得有點枯燥。在接下來有關正則表達式的應用中,將會用到上述相關知識。
4.3.2 正則表達式的語法
正則表達式是本章的一個難點,但其用途很廣。比如從網頁中抓取大量的同類數據,檢驗用戶輸入的格式是否正確等應用中,正則表達式將會使這些功能的實現變得十分容易,而不用去編寫大量的代碼。下面從正則表達式的基本語法開始介紹,如表4-3所示。
表4-3 常用正則表達式

正則表達式就是用各種匹配符來分析文本中的特殊字符串,然后進行處理。得出的結果可能是匹配成功或失敗。可見,該用法在驗證領域有著很強的實用性。下面舉個簡單的例子,比如要匹配中國某地區的座機電話號碼,只需要輸入“^\d{3}-\d{8}$”,即可驗證輸入的號碼格式是否正確。^表示字符串的開始或新行的開始,$表示換行符之前或該行末的字符串結尾,\d{3}表示匹配任意三個數字,可見,只要輸入的號碼是XXX-XXXXXXXX,就會驗證通過(注:該地區區號為三位)。在接下來的兩節中,將舉兩個比較完整的正則表達式應用的例子,以幫助讀者理解。
4.3.3 正則表達式驗證用戶輸入
打開VS2008,在D:\C#\ch4目錄下建立名為RegexTest1的Windows應用程序,添加控件如表4-4所示。
表4-4 控件屬性設置

添加對命名空間System.Text.RegularExpression的引用,因為它包含了正則表達式的類。雙擊“驗證”按鈕,添加如下代碼。
//號碼格式驗證 private void btnVerify_Click(object sender, EventArgs e) { Regex rg = new Regex(@"^\d{3}\s\d{3}-\d{8}$"); string inp = tbNumber.Text; if (rg.Match(inp).Success == false) { lbInfo.Items.Add("驗證未通過,輸入格式不合法" + "\n"); } else { lbInfo.Items.Add("驗證通過" + "\n"); } }
運行結果如圖4-6和圖4-7所示,圖4-6表示驗證未通過的情況,圖4-7表示驗證通過的情況。

圖4-6 驗證未通過

圖4-7 驗證通過
在上例中,要驗證一種電話號碼格式,正確的格式應該是xxx xxx-xxxxxxxx,在圖4-6中,第一項多輸入了一位,所以匹配不成功。
4.3.4 使用正則表達式來替換字符串
打開VS2008,在D:\C#\ch4目錄下建立名為RegexTest2的控制臺應用程序,在Main()函數中添加如下代碼。
Regex rg = new Regex(@"(\D{3})-(\D{3})-(\D{3})-(\D{3})"); //匹配任意非數字 string s = "sss-$2-sss-$4"; string number; Console.WriteLine("請輸入合法的號碼:"); number = Console.ReadLine(); while (rg.Match(number).Success == false) { Console.WriteLine("不合法的號碼,請重新輸入:"); Console.Write("請輸入合法的號碼:"); number = Console.ReadLine(); } Console.WriteLine("號碼被替換為{0}", rg.Replace(number, s)); Console.ReadKey();
運行結果如圖4-8所示。
本例是要用作字符串替換,且字符串必須滿足xxx-xxx-xxx-xxx的格式,而\D表示匹配任意非數字,所以輸入的字符串中不能出現數字。如圖4-8所示,當輸入“aaa-sdf-bbb-w34”時,因為含有數字,所以匹配不通過。當輸入變為“der-frt-rtt-fff”時,匹配通過。然后,將其替換為“sss-frt-sss-fff”。通過對兩個例子的學習,相信讀者已經對正則表達式有了一個基本的了解。如果想要在實際中靈活應用,還需深入學習。

圖4-8 運行結果
4.4 小結
本章內容是C#數據處理的一個基礎,相關知識將會在后面大量用到。本章主要介紹了String類和StringBuilder類。用大量實例分析了這兩個類的相關屬性及方法,特別是StringBuilder類里有關字符串的追加,插入等方法的使用。最后,還介紹了正則表達式的常見語法及其用途,并用兩個實例說明了正則表達式的簡單應用。