字符串的处理
到目前为止,对字符串的使用还仅限于把字符串写到控制台上,从控制台上读取字符串,以及使用 +
运算符连接字符串。在编写较有趣的应用程序时,会发现字符串的操作非常多。所以,下面占用几页的篇幅介绍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>.ToCharArray()
命令类似的格式使用命令。两个简单却有效的命令是 <string>.ToLower()
和 <string>.ToUpper()
。它们可以分别把字符串转换为小写或大写形式。要明白为什么它们非常有用,可以考虑下面的情形:要检查用户的某个响应,例如字符串 yes
。如果可以把用户输入的字符串转换为小写形式,就也能检查字符串 YES
、Yes
、yeS
等,第 4 章介绍了这样一个示例:
string userResponse = Console.ReadLine();
if ( userResponse.ToLower() == "yes" )
{
// Act on response
}
注意 ⚠️,这个命令与本节的其他命令一样,并未真正改变应用它的字符串。把这个命令与字符串结合使用,就会创建一个新的字符串,以便与另一个字符串进行比较(如上所述),或者赋给另一个变量。该变量可以是当前操作的变量,例如:
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 个短横线。
还有许多这样的字符串处理命令,其中一些只用于非常特殊的情况,在后面的章节中遇到它们时再进行讨论。在继续下面内容之前,介绍 Visual Studio 2013 中的一个特性,前几章曾提及(特别是本章)这个特性。下面的示例会试验语句自动完成功能,IDE通过这种功能给出用户有可能要插入的代码。
在 Program.cs 中输入下列代码,注意输入过程中弹出的窗口:
static void Main(string[] args)
{
string myString = "This is a test.";
char[] separator = { ' ' };
string[] myWords;
myWords = myString.
}
输入最后的句点时,注意 ⚠️会弹出如图 5-12 所示的窗口。图 5-12
不要移动光标,键入 sp,弹出窗口就会改变,显示一个工具提示窗口,如图 5-13 所示。图 5-13
输入字符 “(se”,会弹出另外一个窗口和工具提示,如图 5-14 所示。图 5-14
输入两个字符 ");",代码如下所示,弹出窗口随之消失。
static void Main(string[] args)
{
string myString = "This is a test.";
char[] separator = { ' ' };
string[] myWords;
myWords = myString.Split(separator);
}
添加如下代码,注意弹出的窗口。
static void Main(string[] args)
{
string myString = "This is a test.";
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 );
接着使用foreach
循环迭代这个数组中的单词,并把这些单词写到控制台上:
foreach ( string word in myWords )
{
Console.WriteLine("{0}", word);
}
得到的每个单词都没有空格,单词的内部和两端都没有空格。在使用Split()
时,删除了分隔符。 接着分析一下自动完成功能。VS 是智能化极高的程序包,在用户键入代码时会提供许多关于代码的信息。即使在一个新行上键入第一个字符,IDE 也试图帮助用户,列出建议的关键字、变量名、类型名等。只要在上面的代码输入 3 个字母str
,IDE 就会猜出要输入string
。在键入变量名时,这个功能会更有用。在较长的代码中,常会忘记要使用的变量名。IDE 会在用户键入代码的过程中弹出一系列变量名,用户可从中选择,不必查看以前的代码。 在myString
的后面键入句点时,IDE 知道myString
是一个字符串,也知道你要指定一个字符串命令,于是显示可用选项。此时可以停止键入,使用上下箭头键选择需要的命令。在这些可用命令中移动时,IDE 会告诉你当前选中命令的含义,以及使用它的语法。 在开始键入更多字符时,IDE 会自动把它猜测你可能要使用的命令移到命令列表的顶部。一旦它显示出需要的命令,就可以继续键入,就像已经键入完整的名称一样,所以键入 “(” 会直接跳到为某些命令指定需要的额外信息的地方—IDE 甚至会告诉用户该信息必须采用的格式,并显示这些接受各种信息的命令选项。 IDE 的这项功能(也称为IntelliSense
)使用起来非常方便,可以使你轻松地找到奇怪类型的信息。查看string
类型的所有命令时很有趣的,这不会使计算机崩溃,试一试吧! 有时所显示的信息会遮挡前面已经键入的代码,这是很恼人的,因为在键入时可能需要参考被遮挡的代码。此时可按下Ctrl
键,使命令列表变成透明的,以便查看被遮挡的代码。