5.3 字符串的处理
下面用几页的篇幅介绍C#中比较常用的字符串处理技巧。
首先要注意,string 类型变量可以看作是 char 变量的只读数组。这样,就可以使用下面的语法访问每个字符:
string myString = "A string"; char myChar = myString[1];
但是, 不能用这种方式为各个字符赋值。为了获得一个可写的char数组,可以使用下面的代码,其中使用了数组变量的ToCharArray()命令:
string myString = "A string"; char[] myChars = myString.ToCharArray();
接着就可以采用标准方式处理char数组了。也可以在foreach循环中使用字符串,例如:
foreach (char character in myString) { Console.WriteLine("{0}", character); }
与数组一样,还可以使用myString.Length获取元素的个数,这将给出字符串中字符数,例如:
string myString = Console.ReadLine(); Console.WriteLine("You typed {0} characters.", myString.Length);
两个简单但很有效的命令是<string>.ToLower()和<string>.ToUpper()。它们可以分别把字符串转换为大写或小写形式。要明白为什么它们非常有用,可以考虑下面的情形:要检查用户的某个响应,例如字符串yes。如果可以把用户输入的字符串转换为小写形式,就也能检查字符串YES、Yes、yeS等。
注意,这个命令与本节的其他命令一样,并没有真正改变应用它的字符串。把这个命令与字符合并使用,就会创建一个新的字符串,以便与另一个字符串进行比较(如上所述),或者赋给另一变量。该变量可能与当前操作的变量相同,例如:
userResponse = userResponse.ToLower();
这是一个要点,因为只写出下面的代码是没用的:
userResponse.ToLower();
如果用户无意间在输入内容的前面或后面添加了额外的空格,会怎样?此时,上述代码就不起作用了。这就需要删除输入字符串中的空格,此时可以使用<string>.Trim()命令来处理。
string userResponse = Console.ReadLine(); userResponse = userResponse.Trim(); if (userResponse.ToLower() == "yes") { // Act on response. }
使用该命令,还可以检测如下的字符串:
" YES" "Yes "
也可以使用这些命令删除其他字符,只要在一个char数组中指定这些字符即可,例如:
char[] trimChars = {' ', 'e', 's'}; string userResponse = Console.ReadLine(); userResponse = userResponse.ToLower(); userResponse = userResponse.Trim(trimChars); if (userResponse == "y") { // Act on response. }
这将从字符串的前面或后面删除所有空格、字母 e 和 s。如果字符串中没有其他字符,就会检测以下字符串:
"Yeeeees" " y"
还可以使用<string>.TrimStart()和<string>.TrimEnd()命令。它们可以把字符串的前面或后面的空格删掉。这些命令也需要指定char数组。
还有另外两个字符串命令可以处理字符串的空格:<string>.PadLeft()和<string>.PadRight()。它们可以在字符串的左边或右边添加空格,使字符串达到指定的长度。其语法如下:
<string>.PadX(<desiredLength>);
例如:
myString = "Aligned"; myString = myString.PadLeft(10);
这将在myString中把3个空格添加到单词Aligned的左边。这些方法可以用于在列中对齐字符串,特别适用于放置包含数字的字符串。
与修整命令一样,还可以按照第二种方式使用这些命令,即提供要添加到字符串上的字符,这需要一个char,而不是像修整命令那样指定一个char数组。例如:
myString = "Aligned"; myString = myString.PadLeft(10, '-');
这将在myString的开头加上3个短横线。
还有许多这样的字符串处理命令,其中一些只用于非常特殊的情况,在后面的章节中遇到它们时进行讨论。
看个示例,代码如下:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace Ch05Ex05 { class Program { static void Main(string[] args) { string myString = "This is a string"; char[] separator = { ' ' }; string[] myWords; myWords = myString.Split(separator); foreach (string word in myWords) { Console.WriteLine("{0}", word); } Console.ReadKey(); } } }
运行结果如下:
使用命令<string>.Split()把 string 转换为 string 数组,把它在指定的位置分隔开。这些位置采用 char数组的形式,在本例中该数组只有一个元素,即空格字符:
char[] separator = {' '};
下面的代码把字符串在每个空格处分解开时,会得到其子字符串,即得到包含单个单词的数组:
string[] myWords; myWords = myString.Split(separator);
note: 得到的每个单词没有空格,单词的内部和两端都没有空格。在使用 Split()时,删除了分隔符。