------- Windows Phone 7手机开发、.Net培训、期待与您交流! -------
字符串处理
在程序开发中,几乎所有的程序都包含字符串的处理。String类是C#的字符串类型的基础。String类定义了大量的方法、属性和字段,帮助开发人员更好地控制字符串的构造和其他操作。与字符串处理紧密相关的操作是将数据格式化为人类可读的形式。除了String类之外还有StringBuilder类。
String和StringBuilder类
String类表示的是不变字符串,即一旦创建了字符串,就不能更改组成字符串的字符序列。此限制是为了使C#更有效地实现字符串。为了创建一个能够改变其字符序列的字符串,C#提供了StringBuilder类,该类包含在System.Text命名空间中。然而,对于大多数情况,需要使用的是String类而不是StringBuilder类。
String类
String类在System命名空间中定义,它为C#提供字符串处理功能,是C#内置的字符串类型的继承。它表示一系列的有序Unicode字符,用来表示文本。
下面声明一个名称为str的String对象,它的值为“这是一个字符串。”。
string str = "这是一个字符串。"; //声明一个名为str的String类的对象
注意:在.NET Framework中,string和System.String表示同一个类型。实际上,string是System.String类型的简单表示方式。
String对象是字符(Char对象)的有序集合,用来表示字符串。它的值是该有序集合的内容,并且是不可变的。虽然有些方法看起来修改了String对象,而实际上是返回了一个包含修改后内容的新的String对象。
下面声明一个名称为str的String对象,它的值为“这是一个字符串。”。之后,对str变量进行赋值。赋值之后,str变量的值为“这是另一个字符串。”。
string str = "这是一个字符串。"; //创建一个String对象
str = "这是另一个字符串。"; //为str赋值,实际上,也创建了新的String对象
执行“string str = ”这是一个字符串。“;”语句之后,此时,系统为str变量分配了一块内存,并存放“这是一个字符串。”。执行“str = ”这是另一个字符串。“;”语句之后,此时,系统重新为str变量分配了一块新的内存,并存放“这是另一个字符串。”。
注意:“这是一个字符串。”所占有的内存将不能再被引用,它最终被系统自动回收。
String类包含1个只读字段和2个属性,它们的具体说明如下所示。
Empty字段:表示空字符串。Chars属性:获取当前String对象中位于指定字符位置的字符。
Length属性:获取当前String对象中的字符数。
下面首先声明一个名称为str的String对象,它的值为“这是一个字符串。”。然后,获取str对象的Length属性的值(即str对象的长度,它包含字符的数量),并保存为len变量。
namespace ConsoleApplication
{
class Program
{
static void Main(string[] args)
{
string str = "这是一个字符串";
int len = str.Length;
Console.WriteLine("str字符串的长度为:"+len);
Console.ReadKey();
}
}
}
String对象是字符(Char对象)的有序集合。如果要获取String对象中的某一个字符,则需要使用索引。索引是从零开始、从字符串的起始位置(其索引为零)计起的非负数字。索引是Char对象(字符)在String对象中的位置,而不是Unicode字符的位置。
下面首先声明一个名称为s的String对象,它的值为“这是一个字符串。”。然后获取s对象的索引为0的字符,并保存为ch变量。
namespace ConsoleApplication
{
class Program
{
static void Main(string[] args)
{
string s = "这是一个字符串";
char ch = s[0];
Console.WriteLine("索引为0的字符为:" + ch);
Console.ReadKey();
}
}
}
StringBuilder类
在需要对字符串执行重复修改的情况下,使用String对象会每次分配新的内存空间,系统开销会比较昂贵。如果要修改字符串而不创建新的对象,则可以使用StringBuilder类。StringBuilder类表示可变字符串,可以创建能够动态修改(如追加、移除、替换、插入等)的字符串对象。
下面创建一个名称为strb的StringBuilder对象。此时,它的值为空字符串。
StringBuilder strb = new StringBuilder(); //创建一个StringBuilder类的对象
StringBuilder类包括以下4个常用属性,具体说明如下所示。
Length属性:获取或设置StringBuilder对象的长度。
Capacity属性:获取或设置StringBuilder对象的容量。
MaxCapacity属性:获取或设置StringBuilder对象的最大容量。
Chars属性:获取或设置指定位置处的字符。
下面首先创建一个名称为strb的StringBuilder对象。然后添加“这是StringBuilder类的对象。”字符串到strb对象中。最后,获取strb对象的长度(即Length属性的值),并保存为len变量。
namespace ConsoleApplication
{
class Program
{
static void Main(string[] args)
{
StringBuilder strb = new StringBuilder(); //创建StringBuilder对象strb
strb.Append("这是一个StringBuilder对象"); //添加一个对象
int len = strb.Length;
Console.WriteLine("strb的内容为:" + strb);
Console.WriteLine("strb的长度为:" + len);
Console.ReadKey();
}
}
}
通常情况下,如果StringBuilder实例没有指定容量或最大容量,那么该实例具有一个默认容量值。当然,开发人员也可以通过Capacity属性设置该实例的容量,被设置的容量值必须大于或等于其Length属性的值。
注意:对于一个String对象而言,一旦为该对象赋值之后,那么该对象的值所占用的内存是不能被修改的。如果要修改String对象的值,那么将重新分配新的内存。因此,如果频繁修改String对象,则可能产生大量的不可访问的内存,会影响应用程序的性能。由于StringBuilder对象的值占用的内存是可修改的,即对StringBuilder对象每一次的修改操作都可能不需要分配新的内存,而在该对象的值所占的内存上进行操作,从而减少了应用程序的开销。
使用不变字符串
String类表示的字符串是不变字符串。对不变字符串的每一次处理都将产生一个新的字符串。不变字符串处理的方法主要包括插入字符串、移除字符串、替换字符串、联接字符串、分隔字符串、填充字符串等。
插入字符串
插入字符串是指在字符串是指定位置插入一个新的字符串。String类提供Insert()方法实现该功能。
public string Insert(int startIndex,string value)
上述方法将value参数指定字符串插入到字符串的startIndex指定的位置。startIndex参数表示插入的位置(即索引值),value参数表示被插入的新字符串。上述方法返回一个新的字符串。
下面创建名称为str1的String对象,它的值为“这是一个字符串。”。str1对象调用Insert(int startIndex,string value)方法在其索引0处插入“插入字符串…”字符串,并保存新的字符串为str2。
namespace ConsoleApplication
{
class Program
{
static void Main(string[] args)
{
string str1 = "这是一个字符串";
string str2 = str1.Insert(0, "插入字符串…");
Console.WriteLine("str1的内容为:" + str1);
Console.WriteLine("str2的内容为:" + str2);
Console.ReadKey();
}
}
}
执行插入操作之后,str2对象的值为“插入字符串…这是一个字符串。”。
移除字符串
移除字符串是指从字符串指定位置开始移除其后的所有字符或指定数量的字符。String类提供Remove()方法实现该功能。
public string Remove(int startIndex)
上述方法从从startIndex位置开始移除其后的所有字符。startIndex参数表示被移除字符的开始位置。该方法返回一个新的字符串。
public string Remove(int startIndex,int count)
上述方法从startIndex位置开始移除其后的数量为count的字符。startIndex参数表示被移除字符的开始位置,count参数表示被移除字符串的长度。该方法返回一个新的字符串。
下面创建名称为str1的String对象,它的值为“这是一个字符串。”,然后执行以下两个操作。
(1)调用Remove(int startIndex)方法,移除str1对象中从5个字符开始之后的所有字符。执行移除操作之后,新的字符串保存为stra对象。
(2)调用Remove(int startIndex,int count)方法,移除str1对象中从3个字符开始之后的2个字符。执行移除操作之后,新的字符串保存为strb对象。
namespace ConsoleApplication
{
class Program
{
static void Main(string[] args)
{
string str1 = "这是一个字符串";
string stra = str1.Remove(5); //移除5个字符之后的所有字符
Console.WriteLine("stra的内容为:" + stra);
string strb = str1.Remove(3, 2); //移除3个字符之后的2个字符
Console.WriteLine("strb的内容为:" + strb);
Console.ReadKey();
}
}
}
执行第一次移除操作之后,stra对象的值为“这是一个字”。执行第二次移除操作之后,strb对象的值为“这是一符串。”。
替换字符串
替换字符串是指将字符串中指定的字符或字符串用新的字符或字符串替换。String类提供Replace()方法实现该功能。
public string Replace(char oldChar,char newChar)
上述方法将字符串中指定字符替换为新的字符。oldChar参数表示被替换的字符,newChar参数表示替换后的字符。该方法返回一个新的字符串。
public string Replace(string oldValue,string newValue)
上述方法将将字符串中指定字符串替换为新的字符串。oldValue参数表示被替换的字符串,newValue参数表示替换后的字符串。该方法返回一个新的字符串。
下面创建名称为str1的String对象,它的值为“这是一个字符串。”,然后调用Replace(char oldChar,char newChar)方法将str1对象中的“一”字符替换为“二”字符。执行替换操作之后,新的字符串保存为str对象。
namespace ConsoleApplication
{
class Program
{
static void Main(string[] args)
{
string str1 = "这是一个字符串";
string str = str1.Replace("一", "二");
Console.WriteLine("新的字符串为:{0}", str);
Console.ReadKey();
}
}
}
执行替换操作之后,str对象的值为“这是二个字符串。”。
联接字符串
联接字符串是指将一个或多个字符串对象联接为一个新的字符串。String类提供Concat()和Join()方法实现该功能。
public static string Concat(object str0)
上述方法是联接str0对象的字符串表示形式,并创建一个新的字符串。str0参数表示被联接的对象。该方法返回一个新的字符串。
public static string Concat(string str0,string str1)
上述方法联接str0和str1字符串,并创建一个新的字符串。str0参数表示被联接的对象,str1表示被联接的字符串。该方法返回一个新的字符串。
public static string Concat(string str0,string str1,string str2)
上述方法联接str0、str1和str2字符串,并创建一个新的字符串。str0参数表示被联接的对象,str1、str2表示被联接的字符串。该方法返回一个新的字符串。
public static string Concat(string str0,string str1,string str2,string str3)
上述方法联接str0、str1、str2和str3字符串,并创建一个新的字符串。str0参数表示被联接的对象,str1、str2表示被联接的字符串。该方法返回一个新的字符串。
注意:Concat()方法是string类的静态方法。
下面首先创建两个字符串对象:stra和strb,它们的值分别为“这”和“是一个字符串。”。然后调用string类的Concat()静态方法联接stra和strb对象。执行联接操作之后,新的字符串保存为str对象。
namespace ConsoleApplication
{
class Program
{
static void Main(string[] args)
{
string stra = "这";
string strb = "是一个字符串";
string str = string.Concat(stra, strb);
Console.WriteLine("str 字符串为:{0}", str);
Console.ReadKey();
}
}
}
执行联接操作之后,str对象的值为“这是一个字符串。”。
Join()方法可以将数组中的所有字符串联成一个字符串,且各个字符被指定的字符串分隔。
public static string Join(string separator,string[] value)
上述方法将value数组中的所有字符串联接为一个字符串,各个字符被separator分隔。separator参数表示分隔字符串,value参数为一个字符串数组,它包含所有被联接的字符串。该方法返回一个新的字符串。
public static string Join(string separator,string[] value,int startIndex,int count)
上述方法将value数组中的count个字符串(第一个字符串索引为startIndex)联接为一个字符串,各个字符串被separator分隔。separator参数表示分隔字符串,value参数为一个字符串数组,它包含所有被联接的字符串;startIndex参数指定被联接的的一个字符串,count参数指定被联接字符串的数量。该方法返回一个新的字符串。
注意:Join()方法是string类的静态方法。
下面首先创建两个字符串对象:stra和strb,它们的值分别为“这”和“是一个字符串。”。然后调用string类的Join()静态方法联接stra和strb对象。执行连接操作之后,新的字符串保存为str对象。
namespace ConsoleApplication
{
class Program
{
static void Main(string[] args)
{
string stra = "这";
string strb = "是一个字符串";
string str = string.Join("", new string[] { stra, strb });
Console.WriteLine("str = " + str);
Console.ReadKey();
}
}
}
执行联接操作之后,str对象的值为“这是一个字符串。”。
分隔字符串
分隔字符串是指将一个字符串被指定的分隔字符或字符串分隔为多个子字符串,并返回由子字符串组成的字符串数组。String类的提供Split()方法实现该功能。
public string[] Split(params char[] separator);
public string[] Split(char[] separator,int count);
public string[] Split(char[] separator,StringSplitOptions options);
public string[] Split(string[] separator,StringSplitOptions options);
public string[] Split(char[] separator,int count,StringSplitOptions options);
public string[] Split(string[] separator,int count,StringSplitOptions options)。
上述方法实现的是分隔字符串的功能。separator参数表示分隔字符或字符串数组。count参数指定返回的子字符串的最大数量。options参数指定字符串分隔选项,它的类型为StringSplitOptions枚举,可以为以下2个值之一。StringSplitOptions.None:子字符串的数组可以包含空字符串。StringSplitOptions.RemoveEmptyEntries:子字符串的数组不包含空字符串。
下面首先创建名称为str1的字符串,它的值为“这是 一个 字符串 。”。然后调用Split()方法将str1对象分隔为4个子字符串,分隔字符为“ ”(空白字符)。分隔后的子字符串保存为strs数组。
namespace ConsoleApplication
{
class Program
{
static void Main(string[] args)
{
string str1 = "这是 一个 字符串 .";
string[] strs = str1.Split(new char[] { ' ' }, StringSplitOptions.RemoveEmptyEntries);
Console.WriteLine("strs数组的每个元素为:");
foreach (string i in strs)
{
Console.Write(i + " ");
}
Console.ReadKey();
}
}
}
strs数组包含4个字符串,它们的值分别为这是、一个、字符串和。字符串。
填充字符串
填充字符串是指向字符串的指定位置填充指定的字符。String类提供PadRight()和PadLeft()方法实现该功能。其中,PadRight()方法在字符串的右边填充字符,PadLeft()方法在字符串的左边填充字符串。由于这两个方法比较相似,下面只将介绍PadLeft()方法。
public string PadLeft(int totalWidth)
上述方法在字符串的左边填充空白字符。totalWidth参数表示填充之后字符串的总长度。该方法返回一个新字符串。
public string PadLeft(int totalWidth,char paddingChar)
上述方法在字符串的左边填充paddingChar字符。totalWidth参数表示填充之后字符串的总长度,paddingChar参数表示被填充的字符。该方法返回一个新字符串。
下面首先创建名称为str1的字符串,它的值为“这是一个字符串。”。然后调用PadLeft()方法在str1对象的左边填充5个A字符。填充之后的字符串,保存为str2对象。
namespace ConsoleApplication
{
class Program
{
static void Main(string[] args)
{
string str1 = "这是一个字符串";
string str2 = str1.PadLeft(str1.Length + 5, 'A'); //str1.Length + 5是填充的字符串的长度
Console.WriteLine("填充的字符串为:" + str2);
Console.ReadKey();
}
}
}
执行填充操作之后,str2对象的值为“AAAAA这是一个字符串。”。
查找字符串
查找字符串是指从字符串中查找指定的字符或子字符串。如果找到,则返回第一个匹配字符或字符串的索引;否则,返回–1。String类提供IndexOf()和LastIndexOf()方法实现该功能。其中,IndexOf()方法是从字符串的第一个字符开始依照从头到尾的方式查找,LastIndexOf()方法从字符串的最后一个字符开始依照从尾到头的方式查找。
由于IndexOf()和LastIndexOf()方法比较相似,
IndexOf()方法语法如下:
public int IndexOf(string value)
上述方法从字符串的开头位置开始查找value是否存在。该方法返回一个整型数值。
public int IndexOf(string value,int startIndex)
上述方法从字符串的指定位置(startIndex参数指定)开始查找value是否存在。该方法返回一个整型数值。
public int IndexOf(string value,int startIndex,int count)上述方法从字符串的指定位置(startIndex参数指定)开始的后面count个字符中查找value是否存在。该方法返回一个整型数值。
下面首先创建名称为str1的字符串,它的值为“这是一个字符串。”。然后调用IndexOf()方法在str1对象中查找“字”。如果找到,在返回第一个匹配项的索引值;否则,返回–1。其中,返回值保存为index变量。
namespace ConsoleApplication
{
class Program
{
static void Main(string[] args)
{
string str1 = "这是一个字符串";
int index = str1.IndexOf("符");
Console.WriteLine("字符串中的 符 索引是{0}",index);
Console.ReadKey();
}
}
}