第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类里有关字符串的追加,插入等方法的使用。最后,还介绍了正则表达式的常见语法及其用途,并用两个实例说明了正则表达式的简单应用。