第3章 C#字符串处理.docx
- 文档编号:11243549
- 上传时间:2023-02-26
- 格式:DOCX
- 页数:28
- 大小:161.92KB
第3章 C#字符串处理.docx
《第3章 C#字符串处理.docx》由会员分享,可在线阅读,更多相关《第3章 C#字符串处理.docx(28页珍藏版)》请在冰豆网上搜索。
第3章C#字符串处理
第3章字符串处理
字符串是C#里常用的一个引用型数据类型。
它直接从Object类继承而来,在通用类型系统里对应的是System.String类。
System.String类是一个功能强大且用途广泛的基类,它提供了很多方法,用于进行字符串的处理。
本章主要讲解了对字符串的一些基本操作,包括修改、连接字符串及用正则表达式实现对字符串的查询,通过本章学习,读者将了解以下内容:
❑创建字符串。
❑实现修改字符串、连接多个字符串、对字符串进行搜索等操作。
❑了解向控制台输入输出信息的方法。
❑了解正确的注释习惯。
3.1字符串处理
字符串是Unicode字符的有序集合,Unicode字符可以是一个字母,一个数字,一个汉字等。
字符串用于表示文本。
System.String类专门用于存储字符串。
C#提供了它自己的关键字和语法,以便使用该类来进行字符串的处理。
String对象的值是该有序集合的内容,并且该值是不可变的。
3.1.1声明字符串变量
字符串变量是引用类型的变量,声明一个字符串,即创建了对内存里某个空间的引用。
字符串是使用引号声明的,如下例所示:
stringmyStr=“thisismyfirststring”;
该语句声明了一个string类型的变量myStr,该变量被初始化成字符序列“thisismyfirststring”。
假设内存是一个储物间,内存里的存储单元可以看成是储物间里的储物柜。
声明一个字符串变量实际上是在变量名对应的储物柜里存储了实际存放字符串数据的地址信息。
假设有下面代码声明两个不同数据类型的变量:
stringmyStr=“thisismyfirststring”;
inta=100;
上述声明的两个变量在内存里的存储形式如图3.1所示。
图3.1内存里变量的存储
声明字符串的另一种方式是根据char类型数组来初始化string变量,如下面例子:
charstrArray={‘A’,’‘,’s’,’t’,’r’,’i’,’n’,’g’};
stringstr2=newstring(strArray);
str2变量在创建的时候,通过传入的strArray初始化内容为“Astring”。
使用字符串类型是非常容易的,在String类的定义中包含很多方法,可以完成一些常见的任务,只要简单加以选择利用就可以了。
String类的常用的方法如表3.1所示。
表3.1String类的常用方法
属性/方法
说明
Compare()
比较字符串的内容,考虑文化背景(区域),确定某些字符是否相等
CompareOrdinal()
与Compare()方法,但不考虑文化背景(区域)
Concat()
把多个字符串实例合并为一个实例
CopyTo()
把特定数量的字符从选定的下标复制到数组的一个全新实例中
Format()
格式化包含各种值的字符串和如何格式化每个值的说明符
IndexOf()
定位字符串中第一次出现某个给定子字符串或字符的位置
IndexOfAny()
定位字符串中第一次出现某个字符或一组字符的位置
Insert()
把个字符串实例插入到另一个字符串实例的指定索引处
Join()
合并字符串数组,建立一个新字符串
padLeft()
在字符串的开头,通过添加指定的重复字符填充字符串
PadRight()
在字符串的结尾,通过添加指定的重复字符填充字符串
Replace()
用另一个字符或子字符串替换字符串中给定的字符或子字符串
Split()
在出现给定字符串的地方,把字符串一个子字符串数组
Substring()
在字符串中获取给定位置的子字符串
ToLower()
把字符串转换为小写形式
ToUpper()
把字符串转换为大写形式
Trim()
删除首尾的空白
在后面的小节,我们将学习String类的常用方法的使用。
3.1.2修改字符串内容
【本节示例参考:
\源代码\chapter3\3.1.2\ModifyString】
字符串定义好以后,可以在使用过程中修改其值。
这一点不难理解,因为只要是变量,在程序运行过程中其值都可以改变,这也是变量的一个重要特征。
比如下面的例子:
stringstr3=“thisisfirststring”;
Console.WriteLine(“beforemodify:
”+str3);
str3=“thisissecondstring”;//改变字符串变量的值
Console.WriteLine(“aftermodify:
”+str3);
程序运行的输出结果是:
beforemodify:
thisisfirststring
aftermodify:
thisissecondstring
在这个例子中,先将string类型变量str3赋值成“thisisfirststring”,输出字符串内容,然后再将其修改成“thisissecondstring”,再显示它的值。
对字符串的修改很简单,不过读者应该注意,由于string类型数据是引用类型的,这就是说组成字符串的字符序列一旦建立,就不能改变。
事实上,在修改其内容时,是把原来的字符串丢弃,再重新创建一个字符串。
读者不用担心丢弃的字符串发生了什么,C#会自动回收不再使用的字符串对象。
C#的这种工作机制使得对字符串频繁更改的时候,会在内存里分配很多的空间,效率会很低。
为了解决这个问题,C#提供了StringBuilder类。
将在下面章节讲解。
如果要在不丢弃原来字符串的情况下修改字符串的内容,可以将字符串的内容提取到非不可变的窗体中,并对其进行修改,以形成新的字符串实例。
代码3-1使用ToCharArray()方法来将字符串的内容提取到char类型的数组中。
然后修改此数组中的某些元素。
之后,使用char数组创建新的字符串实例。
IndexOf()方法定位字符串中第一次出现某个给定子字符串或字符的位置,如果没有找到指定的字符或字符串,则返回-1。
有关数组的更多知识,可以参考第5章。
代码3-1修改字符串内容:
ModifyString.cs
1.usingSystem;
2.usingSystem.Collections.Generic;
3.usingSystem.Linq;
4.usingSystem.Text;
5.
6.namespaceModifyString
7.{
8.classModifyString
9.{
10.staticvoidMain(string[]args)
11.{
12.//声明string类型变量str4,并初始化
13.stringstr4="MyEmailislandy@";
14.Console.WriteLine("修改前的内容是:
{0}",str4);
15.
//将字符串内容提取到字符数组chars中
16.char[]chars=str4.ToCharArray();
17.//找到子字符串”landy”在str4中的位置
18.intnameIndex=str4.IndexOf("landy");
19.//如果找到”landy”字符串,依次修改字符数组的指定元素
20.if(nameIndex!
=-1)
21.{
22.chars[nameIndex++]='h';//字符数组依次赋值
23.chars[nameIndex++]='e';//字符数组依次赋值
24.chars[nameIndex++]='l';//字符数组依次赋值
25.chars[nameIndex++]='l';//字符数组依次赋值
26.chars[nameIndex++]='o';//字符数组依次赋值
27.}
28.//由数组创建字符串
29.
str4=newstring(chars);
30.Console.WriteLine("修改后的内容是:
{0}",str4);
31.Console.ReadLine();
32.}
33.}
34.}
在执行了char[]chars=str4.ToCharArray()这句语句后,字符串变量str4中的数据被提取到一个字符数组chars中,这时,chars中存储的数据如图3.2所示,数组中的每一个元素数据是char型,存储一个字符。
然后修改该数组中从nameIndex位置开始的一些元素。
再通过str4=newstring(chars)语句,将chars数组中的元素提取到str4中。
该段代码运行效果如图3.3所示。
图3.2chars数组元素图3.3程序运行结果
3.1.3改变大小写
【本节示例参考:
\源代码\chapter3\3.1.3\StringExample】
在对字符串进行处理时,有些时候需要修改字母的大小写。
比如一个在线考试系统,要考查同学们背单词的情况,假设让同学输入“计算机科学”,有人习惯写成“ComputerScience”,也可以小写成“computerscience”。
那怎么来判断用户输入到底是不是正确的呢?
这时可以将输入的字符全部统一成大写或是小写,然后和标准答案进行对比。
表3.1中列出的ToLower()方法和ToUpper()方法可以将指定字符串中的字母改成全小写或全大写的。
代码3-2模拟了一个简单的在线考试,为了简化程序设计,该程序只考一个单词。
在这段程序中用到了Trim()方法来删除输入字符串的首尾的空白,然后用ToUpper()方法将指定字符串转换成大写形式。
代码3-2字符串方法使用示例:
StringExample.cs
1.usingSystem;
2.usingSystem.Collections.Generic;
3.usingSystem.Linq;
4.usingSystem.Text;
5.
6.namespaceStringExample
7.{
8.classStringExample
9.{
10.staticvoidMain(string[]args)
11.{
12.//向控制台输出提示信息:
请输入一个字符串
13.Console.Write("请输入‘计算机科学’的英文字符:
");
14.//从控制台输入一个字符串,并删除其首尾空白
15.stringstr5=Console.ReadLine().Trim();
16.
//将指定字符串转换成大写形式,并判断是否和COMPUTERSCIENCE相同
17.if(str5.ToUpper()=="COMPUTERSCIENCT")
18.Console.WriteLine("回答正确");//输出“正确”提示
19.Console.ReadLine();
20.}
21.}
22.}
23.
假设用户输入的字符串是“computerscience”,注意这里的“computer”之前有一些空格,程序运行的结果如图3.4所示,可以看出,Trim()方法删除了“computer”之前的空格,否则比较的结果是不相等的。
图3.4程序运行结果
这段代码的执行过程如下:
(1)向控制台输出提示信息。
(2)用户输入字符串,在本例中的用户输入是“computerscience”。
并调用了Trim()方法,删除其首尾的空格,删除空格后,将其赋值给string类型变量str5。
(3)str5调用ToUpper()方法,转换成大写形式后比较与指定单词是否一致。
(4)若比较结果一致,则输出“正确”提示。
说明:
String.ToUpper()方法只能把指定字符串中的字母改写成大写形式,对于字符串中的其它非字母字符不起作用。
例如,如果将hello123转换成大写形式,会是HELLO123。
3.1.4联接多个字符串
连接字符串也是一个经常要用到的字符串的基本操作。
对字符串的连接实际在之前的操作就已经遇到过了。
在之前的示例里有这样的代码:
Console.WriteLine(“beforemodify:
”+string1);
在这里通过对运算符的重载实现了字符串的连接。
用运算符“+”就能将两个字符串连接起来。
例如下面的语句:
stringstr1=“This”;//定义字符串变量
stringstr2=“is”;
stringstr3=“C#”;
stringstr3=str1+str2+str3;//连接字符串变量
最后str3的值为字符串“ThisisC#”。
在前面的示例中,将str1、str2和str3的内容连接起来以构成一个字符串时,包含“This”、“is”和“C#”的三个字符串均保持不变。
“=”赋值运算符会创建一个包含组合内容的新字符串。
结果是str3现在引用一个完全不同的字符串。
包含“C#”的字符串仍然存在,但连接str3后将不再被引用。
说明:
也可以用StringBuilder类的Append()方法来实现字符串联接,详细请参考以下相关章节。
3.1.5使用Split方法分析字符串
【本节示例参考:
\源代码\chapter3\3.1.5\SplitString】
String.Split()方法返回包含此实例中的子字符串的字符串数组。
所谓字符串数组,实际上就是每个元素都是一个字符串的数组。
子串的提取是由指定字符串或Unicode字符元素作为的分隔数组。
比如要将字符串“Stringprocessmethods”按空格作为分隔符,提取出的字符串数组如图3.5所示。
图3.5由字符串提取出的字符串数组
代码3-3演示了如何使用Split()方法分析字符串。
在本例中,每个数组元素是一个单词。
Split()采用一个字符数组指示哪些字符被用作分隔符,可以使用空格、逗号、句点、冒号和制表符等,本例中使用了空格。
一个含有这些分隔符的数组被传递给Split(),并使用结果字符串数组分别显示句子中的每个单词。
代码3-3用Split方法分析数组:
SplitString.cs
1.usingSystem;
2.usingSystem.Collections.Generic;
3.usingSystem.Linq;
4.usingSystem.Text;
5.
6.namespaceSplitString
7.{
8.classSplitString
9.{
10.staticvoidMain(string[]args)
11.{
12.stringinputString;//输入的字符串
13.string[]splitStrings;//分割后的字符串数组
14.stringjoinString;//连接后的新字符串
15.//输入提示
16.Console.WriteLine("请输入一串字符串,用空格分隔单词:
");
17.
inputString=Console.ReadLine();//接收输入
18.splitStrings=inputString.Split('');
19.//将分割后的字符串输出
20.Console.WriteLine("\n分割后的字符串为:
");
21.//通过foreach循环输出分割字符串数组中的每一个元素
22.foreach(stringsinsplitStrings)
23.{
24.
Console.WriteLine(s);
25.}
26.//将分割后的字符串使用下划线连接在一起
27.joinString=string.Join("_",splitStrings);
28.//将连接后的字符串输出
29.Console.WriteLine("\n连接后的新字符串为:
{0}",joinString);
30.Console.ReadLine();
31.}
32.}
33.}
注意:
在上述代码的语句splitStrings=inputString.Split('')中,Split('')参数的单引号里有一个空格。
假设用户输入的字符串是“hellofromC#”,该段代码运行的效果如图3.6所示。
图3.6程序运行结果
这段代码的执行过程如下:
(1)声明string类型的输入字符串inputString,以及连接后的新字符串joinString、字符串数组splitStrings。
(2)向控制台输出提示信息,用户输入字符串并赋值给inputString,在本例中的用户输入是“hellofromC#”。
(3)以空格作为分隔符分割字符串inputString,分离成为字符串数组splitStrings。
此时,字符串数组splitStrings的长度是3,即存储了3个元素,分别是“hello”、“from”、“C#”。
(4)使用foreach循环输出splitStrings数组的每一个元素。
有关循环的知识,读者可以参考第4章。
(5)将分割后的字符串使用下划线连接在一起,并将连接后的字符串赋给joinString。
(6)输出连接后字符串的值。
3.1.6使用字符串方法搜索字符串
【本节示例参考:
\源代码\chapter3\3.1.5\SearchString】
string类型为搜索字符串的内容提供了许多有用的方法。
代码3-4示例使用IndexOf()、LastIndexOf()、StartsWith()和EndsWith()方法来对字符串进行处理。
StartsWith()、EndsWith()方法用于判断某个字符串是否以指定的字符或字符串开始或结束,返回的是布尔值。
代码3-4用字符串方法搜索字符串:
SearchString.cs
1.usingSystem;
2.usingSystem.Collections.Generic;
3.usingSystem.Linq;
4.usingSystem.Text;
5.
6.namespaceSearchString
7.{
8.classProgram
9.{
10.staticvoidMain()
11.{
12.stringmyStr="Itisabeautifulworld,isn'tit?
";
13.System.Console.WriteLine("原始的字符串是:
{0}",myStr);
14.//确定myStr的开头是否与指定的字符串匹配。
返回值是bool类型
15.booltest1=myStr.StartsWith("it");
16.System.Console.WriteLine("startswith'it'?
{0}",test1);
17.//确定myStr的开头是否与指定的字符串匹配,忽略大小写。
返回值是bool类型
18.booltest2=myStr.StartsWith("it",
19.System.StringComparison.OrdinalIgnoreCase);
20.System.Console.WriteLine("startswith'if'?
(ignoringcase){0}",test2);
21.//确定myStr末尾是否与指定的字符串匹配。
返回值是bool类型
22.booltest3=myStr.EndsWith(".");
23.System.Console.WriteLine("endswith'.'?
{0}",test3);
24.//定位字符串中第一次出给定子字符串或字符的位置
25.intfirst=myStr.IndexOf("is");
26.//返回指定的Unicode字符或String在此实例中的最后一个匹配项的索引位置。
27.intlast=myStr.LastIndexOf("is");
28.//从此字符串检索子字符串。
子字符串从指定的字符位置开始且具有指定的长度。
29.stringmyStr2=myStr.Substring(first,last-first);
30.System.Console.WriteLine("betweentwo'is'words:
'{0}'",myStr2);
31.Console.ReadLine();
32.}
33.}
34.}
该段代码输出结果如图3.7所示。
图3.7程序运行结果
3.1.7使用正则表达式搜索字符串
【本节示例参考:
\源代码\chapter3\3.1.6\SearchStringWithReg】
正则表达式语言是一种专门用于字符串处理的语言。
一个正则表达式,就是用某种模式去匹配一类字符串的一个公式。
正则表达式定义的搜索模式就像是一个模板,告诉程序你想要处理什么样的字符串,符合这些规定的字符串就能被该正则表达式识别。
最初正则表达式是在UNIX环境中开发的,Microsoft把它移植到Windows中。
System.Text.RegularExpressions命名空间中许多.NET类都支持正则表达式,实际上,在ASP.NET中,验证控件就是使用正则表达式。
可以用Regex类搜索字符串,这些搜索可以涵盖从非常简单到全面使用正则表达式的复杂范围。
代码3-5是一个控制台应用程序,用于对数组中的字符串执行简单的,不区分大小写的搜索。
给定要搜索的字符串和包含搜索模式的字符串后,利用静态方法IsMatch()执行搜索。
在本例中,使用第三个参数指示忽略大小写。
代码3-5用正则表达式搜索字符串:
SearchStringWithReg1.cs
1.usingSystem;//引入命名空间
2.usingSystem.Collections.Generic;
3.usingSystem.Linq;
4.usingSystem.Text;
5.usingSystem.Text.RegularExpressions;
6.
7.namespaceSearchStringWithReg//定义命名空间
8.{
9.classSearchStringWithReg1
10.{
11.staticvoidMain()
12.{
13.//定义字符串数组,里面包含4个字符串元素
14.string[]sentences=
15.{
16."C#2008ProfessionalProgramming",//数组元素用逗号隔开
17."C#DesignPa
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 第3章 C#字符串处理 C# 字符串 处理