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