第5章 掌握字符与字符串
( 名师课堂:55分钟)
.NET Framework类库中提供了强大的字符和字符串处理功能,其中Char类是C#提供的字符类型,String类是C#提供的字符串类型,开发人员可以通过这两个类提供的方法对字符和字符串进行各种操作;另外,本章还讲解了StringBuilder类与String类的区别,通过本章的学习,读者可以掌握以下知识:
了解字符和字符串的区别
掌握Char类的概念及应用
掌握字符串的基本操作
掌握StringBuilder类的用法
了解StringBuilder类与String类的区别
5.1 Char字符类应用
专题讲座:光盘\MR\Video\5\ Char字符类.exe
视频速递:详细讲解字符类的概念及应用。
本节重点讲解Char类的概念及应用,通过本节的学习,读者完全能够掌握什么是字符,以及在开发中如何使用字符,希望读者能够认真学习本节的内容。
5.1.1 Char类的概述
Char在C#中表示一个Unicode字符,正是这些Unicode字符构成了字符串,Unicode字符是目前计算机中通用的字符编码,它为针对不同语言中的每个字符设定了统一的二进制编码,用于满足跨语言、跨平台的文本转换及处理的要求。其实字符离我们并不遥远,比如,计算机按键上的单个字母、单个数字都是字符。Char的定义非常简单,可以通过下面的代码定义字符。
char ch1='a'; char ch2='B';
学习手册 注意
Char只定义一个Unicode字符。
5.1.2 Char类的应用
Char类为开发人员提供了许多方法,可以通过这些方法灵活地操控字符。Char类的常用方法及说明如表5.1所示。
表5.1 Char类的常用方法及说明
学习手册 提示
可以看到Char提供了非常多的实用方法,其中以Is和To开头的比较重要。以Is开头的方法大多是判断Unicode字符是否为某个类别,以To开头的方法主要是转换为其他Unicode字符。
实例位置:光盘\\MR\\I Insttance\\5\\5..1
【例5.1】 创建一个网站,在网站的后台代码中声明几个字符变量并赋值。然后,使用Char类中的多个方法来判断字符变量的相关内容。例如,判断字符是否为字母、是否是大写字母等,运行结果如图5-1所示。
图5-1 Char类中常用方法的使用
实现的代码如下所示:
5.1.3 转义字符
C#采用字符“\”作为转义字符。例如,定义一个字符,而这个字符是单引号,如果不使用转义字符,则会产生错误。
转义字符就相当于一个电源变换器,电源变换器就是通过一定的手段获得所需的电源形式,如交流变为直流、高电压变为低电压、低频变为高频等。转义字符是将字符转换成另一种操作形式,或是将无法一起使用的字符进行组合。
学习手册 注意
转义符\(单个反斜杠)只针对后面紧跟着的单个字符进行操作。
【例5.2】 不使用转义字符,直接将单引号赋值给字符变量,会产生错误,代码如下。
protected void Page_Load(object sender, EventArgs e) { char M='''; //声明一个字符变量,值为单引号 }
程序的运行结果如图5-2所示。
图5-2 错误提示
【例5.3】 为了避免此类错误,应该使用转义字符,代码如下所示。
protected void Page_Load(object sender, EventArgs e) { char a='\''; //使用转义字符定义字符的值为单引号 }
另外还有其他转义字符,如表5.2所示。
表5.2 转义字符及说明
学习手册 技巧
通过以下两种方式,可以让转义字符不发生转义。
① 通过@符实现,如:@“\n”。
② 通过逐字指定字符串字面值(两个反斜杠)实现,如:“\\n”。
实例位置:光盘\\MR\\IInsttance\\5\\5..2
【例5.4】 创建一个网站,在Page_Load事件中编写代码。首先,不使用转义字符,正常输出四句话。然后,使用转义字符为每句话加上引号,并输出到页面,运行结果如图5-3所示。
图5-3 转义字符的使用
实现的代码如下所示。
5.2 使用静态字符串类String
专题讲座:光盘\MR\Video\5\ String字符串类.exe
视频速递:详细讲解字符串类的概念及多种应用。
在ASP.NET中提供了String类来对字符串进行操作。这些操作在很大程度上方便了开发人员,而且编写程序的灵活性也得到大大增强。下面介绍常用的字符串处理。
5.2.1 字符串的概念
字符串型表示一系列字符,是使用string关键字声明的一个字符数组。.NET Framework中表示字符串的关键字为string。例如,“我们是中国人”,这就可以成为一个字符串。甚至还可以将数字定义为字符串。例如,下边的代码就是将数字定义为字符串。
string s_shj=”0112”;
所以说,字符串的变化是多种多样的,读者在学习中不要拘泥于字符串的概念,要根据实际情况灵活运用。
5.2.2 比较字符串
比较字符串是指按照字典排序的规则,判断两个字符串的大小,在英文字典中,在前面的单词小于在后面的单词。String类中,常用的比较字符串的方法包括Compare、CompareTo以及Equals等,下面对它们进行详细介绍。
1.Compare方法
Compare方法是String类的静态方法,用于全面比较两个字符串对象。
语法:
Int compare(string strA,string strB)
参数strA和strB为待比较的两个字符串。
Compare方法的返回值如表5.3所示。
表5.3 Compare方法的返回值
实例位置:光盘\\MR\\IInsttance\\5\\5..3
【例5.5】 声明两个字符串变量并初始化,然后通过Compare方法比较两个字符串,得到如图5-4所示的结果。
图5-4 通过Compare方法比较字符串
实现的代码如下所示:
protected void Page_Load(object sender, EventArgs e)
{
System.String Str1 = "您好"; //声明字符串并赋值
System.String Str2 = "您好吗"; //声明字符串并赋值
//字符串比较
Response.Write(String.Compare(Str1, Str2)+"<br>");
//如果第一个字符串小于第二个则返回负整数
Response.Write(String.Compare(Str1, Str1) + "<br>");
//如果两个字符串相同则返回0
Response.Write(String.Compare(Str2, Str1) + "<br>");
//如果第一个字符串大于第二个则返回正整数
}
学习手册 注意
CompareTo方法将当前字符串对象与另一个字符串对象作比较,其作用与Compare类似,返回值也是相同的。
2.Equals方法
Equals方法用于判断两个字符串是否相同。
语法:
Public bool Equals(string)
如果两个字符串相等,Equals()返回值为True;否则返回False。
实例位置:光盘\\MR\\IInsttance\\5\\5..4
【例5.6】 在开发会员登录时,除了使用相等运算符判断用户名和密码是否正确外,还可以使用Equals方法进行判断,运行结果如图5-5所示。
图5-5 Equals方法的使用
实现的代码如下所示:
protected void btnlogin_Click(object sender, EventArgs e)
{
if (txtname.Text.Equals("mr") && txtpwd.Text.Equals("mrsoft"))
//判断用户名和密码是否正确
{
//如果输入的与指定的用户名和密码相同,说明用户名和密码合法,则弹出提示信息
ClientScript.RegisterStartupScript(this.GetType(), "", "alert('登录成功');",
true);
}
else //如果不相等
{
//则弹出错误提示信息
ClientScript.RegisterStartupScript(this.GetType(), "", "alert('登录失败');",
true);
}
}
学习手册 注意
Equals方法区分大小写,ClientScript.RegisterStartupScript方法用于在当前网页中弹出提示窗口。
5.2.3 格式化字符串
String.Format方法能够将任何数值、枚举以及日期和时间等基本数据类型表示为指定格式的字符串,即格式化。
语法:
String Format(String,Object);
将指定的String中的格式项替换为指定的Object实例的值的文本等效项。
实例位置:光盘\\MR\\IInsttance\\5\\5..5
【例5.7】 在数据绑定时,因为有时候会将数据格式化成自己想要的格式,所以经常格式化字符串。所谓的数据绑定就是将数据库中的数据提取出来显示在数据绑定控件上,关于数据绑定我们在以后的章节中会有所介绍。本实例主要是将指定的数字格式化为Currency类型,将当前时间格式化成ShortDate类型,运行结果如图5-6所示。
图5-6 格式化字符串
实现的代码如下所示:
protected void Page_Load(object sender, EventArgs e)
{
//格式化为Currency类型
string str1 = String.Format("(C) Currency:{0:C}\n", -123.45678f);
//格式化为ShortDate类型
string str2 = String.Format("(d) Short date: {0:d}\n", DateTime.Now);
Response.Write(str1+"<br>");
Response.Write(str2);
}
5.2.4 截取字符串
Substring方法可以从指定字符串中截取子串。
语法:
String.Substring(Int32,Int32);
参数1表示子串的起始位置;参数2表示子字符串的长度。
实例位置:光盘\\MR\\IInsttance\\5\\5..6
【例5.8】 截取字符串在开发中是非常有用的,很多时候都需要截取字符串。举个最简单的例子,在页面中显示数据时,如果数据过长可能会破坏页面布局,此时就需要对数据进行截取,长度超过指定长度时就用“…”代替。运行结果如图5-7所示。
图5-7 截取字符串
实现的代码如下所示:
protected void Page_Load(object sender, EventArgs e)
{
string str = "十里平湖霜满天,寸寸青丝愁华年。对月形单影相互,只羡鸳鸯不羡仙。";
string substr = str.Substring(0, 15)+"..."; //截取字符串
Response.Write(substr); //输出截取后的字符串
}
5.2.5 分割字符串
Split方法可以把一个字符串按照某个分隔符分割成一系列小的字符串。
语法:
String[] Split(Char[]);
其中,参数为分隔字符串的分隔符数组。
实例位置:光盘\\MR\\IInsttance\\5\\5..7
【例5.9】 在实际开发中,经常使用Split方法对用户权限、用户注册时选择的爱好等进行分割,从而将其绑定到相应的控件中。本实例首先创建一个字符串赋值为“Hello·World!”,通过Split方法将其在“.”和“!”处进行分割,分割之后返回字符串数组,然后将数组中的字符串输出,运行结果如图5-8所示。
图5-8 分割字符串
实现的代码如下所示:
protected void Page_Load(object sender, EventArgs e)
{
string str = "Hello.World!"; //声明字符串并赋值
string[] split = str.Split(new Char[] { '.', '!' }); //根据指定的字符进行分割
foreach (string s in split) //遍历分割后的字符数组
{
if (s.Trim() != "")
Response.Write(s+"<br>"); //输出数组中的内容
}
}
5.2.6 替换字符串
Replace方法可以替换掉一个字符串中的某些特定字符或者子串。
语法:
String Replace(String String);
其中,第一个参数为待替换的子串;第二个参数为替换后的新子串。
实例位置:光盘\\MR\\IInsttance\\5\\5..8
【例5.10】 在实际开发中,经常使用Replace方法过滤脏字。其原理就是将字符串中的脏字替换成某个字符。例如,本实例中首先创建一个字符串并赋值为“他爷爷的年纪大了,身体很不好”,但是,很可能这个字符串中的某些语言涉及脏字。所以,对其进行过滤。运行结果如图5-9所示。
图5-9 替换字符串
实现的代码如下所示:
protected void Page_Load(object sender, EventArgs e)
{
string str = "他爷爷的年纪大了,身体很不好"; //声明一个可能含有脏字的字符串
string repstr = str.Replace("他爷爷的","****"); //替换指定的字符串
Response.Write(repstr); //输出替换后的字符串
}
5.3 使用可变字符串类StringBuilder
专题讲座:光盘\MR\Video\5\StringBuilder字符串类.exe
视频速递:讲解StringBuilder类的概念、应用及与String类的区别。
本章重点介绍什么是StringBuilder类,并且通过实例演示如何使用StringBuilder类。StringBuilder类在开发时应用还是比较广泛的,可能读者对StringBuilder类和String类的区别感到模糊,本节也会详细介绍两者的区别。
5.3.1 StringBuilder类的概述
StringBuilder类亦称为可变字符串,它位于System.Text命名空间下,之所以称为可变字符串,是因为该类的对象在通过追加、移除、替换或插入字符串后不会生成新的字符串对象,即字符串变量始终指向同一个对象。
StringBuilder类有6种不同的构造方法,这里列出程序开发中最常用4种,其语法格式如下。
public StringBuilder() public StringBuilder(string value) public StringBuilder(int capacity) public StringBuilder(string value,int capacity)
其中,value表示StringBuilder对象引用的字符串。capacity设定StringBuilder对象的初始大小,即StringBuilder对象的容量。
【例5.11】 创建一个StringBuilder对象,其初始引用的字符串为“欢乐斗地主!”,代码如下。
StringBuilder sb = new StringBuilder("欢乐斗地主!");
5.3.2 StringBuilder类的应用
StringBuilder类存在于System.Text命名空间中,如果要创建StringBuilder对象,首先必须引用此命名空间。StringBuilder类中常用的方法及说明如表5.4所示。
表5.4 StringBuilder类中常用的方法及说明
下面通过实例来演示如何使用StringBuilder类中的这5种方法。
实例位置:光盘\\MR\\IInsttance\\5\\5..9
【例5.12】 首先实例化一个StringBuilder类型的对象sb,其初始值为“出塞”,初始大小为100,然后使用StringBuilder类的Append、AppendFormat、Insert、Remove和Replace方法操作StringBuilder对象,运行结果如图5-10所示。
图5-10 StringBuilder类中常见方法的应用
实现的代码如下所示。
protected void Page_Load(object sender, EventArgs e) { StringBuilder sb = new StringBuilder("无题", 100); //创建StringBuilder类的对象 sb.Insert(2, "(作者:红尘倒影)"); //在索引为2的位置添加字符串 sb.Append("长春<br>十里平湖霜满天" + "<br>"); //添加字符串(诗句) sb.Append("寸寸青丝愁华年" +<br>"); //添加字符串(诗句) sb.Append("对月形单影相互" + "<br>"); //添加字符串(诗句) sb.Append("只羡鸳鸯不羡仙" +"<br>"); //添加字符串(诗句) sb.Remove(11, 2); //移除从索引11开始的2个字符(即“长春”) sb.Replace("(作者:红尘倒影)", "(作者:无名氏)"); //替换掉错误的作者名称 sb.AppendFormat("{0:D}", DateTime.Now.ToString());//添加当前时间 Response.Write(sb); }
5.3.3 StringBuilder类与String类的区别
String类和StringBuilder类都用来处理字符串,它们之间有着较多相似的常规用法,并且这二者之间可以相互转换,这导致许多人在程序设计中不严格区分这二者,甚至认为这二者基本相同,是可以通用的。但实际情况不然,而是这二者之间的内在差别非常大。下面将对这两个类进行详细区分。
String类型表示Unicode字符的字符串,该类型的字符串对象是只读的,也就是说,一旦创建了某个字符串对象,那么该字符串对象就不能够修改。表面看来能够修改字符串的所有方法实际上并没有修改原有的字符串,而是生成另外一个全新的字符串对象。
StringBuilder类型表示值为可变字符序列的类似字符串的对象。之所以说值是可变的,是因为可以对StringBuilder对象进行追加、移除、替换或插入字符来对其进行修改,这点与String类型恰恰相反。大多数修改StringBuilder实例的方法都返回对同一实例的引用。由于返回的是对实例的引用,因此可以调用该引用的方法或属性。如果想要编写将连续操作依次连接起来的单个语句,这将很方便。
【例5.13】 下面通过一个例子来具体看一下StringBuilder类与String类的区别,首先看下面一段代码:
string str="QQ"+"农场"; stringbuilder sb=new stringbuilder(); sb.append("QQ"); sb.append("农场");
上面的代码分别使用string类和StringBuilder类连接字符串,但这两种方法在内存中的操作是不同的,第一种方法在内存中操作时,有3个string(分别为"QQ"、"农场"、"QQ农场")变量;而第二种方法在内存中操作时只有一个("QQ农场")变量,所以它们的性能是完全不同的。
学习手册 技巧
当程序中需要对某个字符串进行大量操作时,应该考虑应用StringBuilder类处理该字符串,其设计目的就是针对大量string操作的一种改进办法,避免产生太多的临时对象。当程序中只是对某个字符串进行一次或几次操作时,采用string类即可。
5.4 实战练习
5.4.1 巧截字符串的数字
题目描述
本实例主要实现的是在包含数字的字符串中剥离数字,并输出到页面,这个功能是如何开发的呢?其实,开发起来并不复杂。读者可以尝试自己开发该功能,作者开发了一个小程序,能够实现该功能,仅供读者参考,效果如图5-11所示。
图5-11 巧截字符串的数字
技术指导
截取字符串中的数字时,可以先使用CharEnumerator对象的MoveNext方法循环访问字符串中的每个字符,并将字符用System.Text.Encoding类中ASCII编码方式的GetBytes方法进行编码,然后判断经过编码之后的字符的ASCII码值是否介于48和57之间,如果是,则说明是数字。
紧急救援
如果你在做本例题的过程中遇到困难或疑惑,可以按照下面救援通道提供的网址获取本例题的源码和技术文档。
救援通道:http://www.mrbccd.com/ASP.NET/loveASP.NET/5.4.1
5.4.2 在字符串中查找指定的字符或字符串
题目描述
我们在数据库中可以检索某个数据,在数组中也可以搜索数据。那么,是否在字符串中也可以查找某个字符或字符串呢?答案是肯定的。本实例就要求在字符串中查找指定的字符或字符串,效果如图5-12所示。
图5-12 在字符串中查找指定的字符或字符串
技术指导
开发本实例时,首先声明string类型变量,为其随意设置初始字符串及用来进行查询的数据。然后通过IndexOf方法在字符串中查找指定的字符或字符串,将查询结果输出到页面。
紧急救援
如果你在做本例题的过程中遇到困难或疑惑,可以按照下面救援通道提供的网址获取本例题的源码和技术文档。
救援通道:http://www.mrbccd.com/ASP.NET/ loveASP.NET/5.4.2
5.4.3 颠倒字符串
题目描述
颠倒输出字符串时,可以先将要输出的字符串保存到一个char类型的数组中,然后使用Array类的Reverse方法将数组中的元素颠倒输出,效果如图5-13所示。
图5-13 颠倒字符串
技术指导
反转字符串可以考虑使用Array类的Reverse方法,它可以反转一个一维数组中所有元素的顺序,该方法的参数为一个一维数组,这样可以考虑把要反转的字符串转换为字符型的一维数组,这需要使用String类的ToCharArray方法,该方法可以把指定字符串转换为一维字符数组。参考代码如下所示:
char[] charStr = strRead.ToCharArray(); //把字符串strRead转换为一维字符数组 Array.Reverse(charStr); //反转一维字符数组中的所有元素
紧急救援
如果你在做本例题的过程中遇到困难或疑惑,可以按照下面救援通道提供的网址获取本例题的源码和技术文档。
救援通道:http://www.mrbccd.com/ASP.NET/loveASP.NET/5.4.3
5.5 本章小结
本章介绍了用于文本处理的Char、String和StringBuilder类。在介绍这3个类时,结合了大量的实例进行讲解,使读者能够从实例中掌握每种类的用法。在阅读本章时,读者要重点掌握String类中处理字符串的一些方法,这些方法在开发程序时会经常用到。StringBuilder类允许使用同一个字符串对象进行字符串的维护操作,这样,可以在操作字符串数据的过程中提高效率,尤其是处理大量文字数据时。另外,还要注意String类与StringBuilder类的本质区别。