第8章 字符串和正则表达式

上传人:飞*** 文档编号:6446700 上传时间:2017-09-11 格式:DOC 页数:17 大小:115.50KB
返回 下载 相关 举报
第8章  字符串和正则表达式_第1页
第1页 / 共17页
第8章  字符串和正则表达式_第2页
第2页 / 共17页
第8章  字符串和正则表达式_第3页
第3页 / 共17页
第8章  字符串和正则表达式_第4页
第4页 / 共17页
第8章  字符串和正则表达式_第5页
第5页 / 共17页
点击查看更多>>
资源描述

《第8章 字符串和正则表达式》由会员分享,可在线阅读,更多相关《第8章 字符串和正则表达式(17页珍藏版)》请在金锄头文库上搜索。

1、第 8 章 字符串和正则表达式在本书的第一部分,我们一直在使用字符串,并说明 C#中 string 关键字的映射实际上指向.NET 基类 System.String。System.String 是一个功能非常强大且用途非常广泛的基类,但它不是.NET 中唯一与字符串相关的类。本章首先复习一下 System.String 的特性,再介绍如何使用其他的.NET 类来处理字符串,特别是 System.Text 和 System.Text.Regular Expressions 命名空间中的类。本章主要介绍下述内容: 创建字符串:如果多次修改一个字符串,例如,在显示字符串或将其传递给其他方法或应用程序

2、前,创建一个较长的字符串,String 类就会变得效率低下。对于这种情况,应使用另一个类 System.Text.StringBuilder,因为它是专门为这种情况设计的。 格式化表达式:这些表达式将用于后面几章中的 Console.WriteLine()方法。格式化表达式使用两个有效的接口 IFormatProvider 和 IFormattable 来处理。在自己的类上执行这两个接口,就可以定义自己的格式化序列,这样,Console.WriteLine() 和类似的类就可以以指定的方式显示类的值。 正则表达式:.NET 还提供了一些非常复杂的类来识别字符串,或从长字符串中提取满足某些复杂条

3、件的子字符串。例如,找出字符串中重复出现的某个字符或一组字符,或者找出以 s 开头、且至少包含一个 n 的所有单词,或者找出遵循雇员 ID 或社会安全号码约定的字符串。虽然可以使用 String 类,编写方法来执行这类处理,但这类方法编写起来比较繁琐,而使用 System.Text.RegularExpressions 命名空间中的类就比较简单,System.Text. RegularExpressions 专门用于执行这类处理。8.1 System.String 类在介绍其他字符串类之前,先快速复习一下 String 类上一些可用的方法。System.String 是一个类,专门用于存储字符

4、串,允许对字符串进行许多操作。由于这种数据类型非常重要,C#提供了它自己的关键字和相关的语法,以便于使用这个类来处理字符串。使用运算符重载可以连接字符串:string message1 = Hello; /return Hellomessage1 += , There; / return Hello, There string message2 = message1 + !; / return Hello, There!C#还允许使用类似于索引器的语法来提取指定的字符:char char4 = message4; / returns a. Note the char is zero-index

5、ed这个类可以完成许多常见的任务,例如替换字符、删除空白和把字母变成大写形式等。可用的方法如表 8-1 所示。表 8-1方 法 作 用Compare 比较字符串的内容,考虑文化背景(区域) ,确定某些字符是否相等CompareOrdinal 与 Compare 一样,但不考虑文化背景Concat 把多个字符串实例合并为一个实例CopyTo 把特定数量的字符从选定的下标复制到数组的一个全新实例中Format 格式化包含各种值的字符串和如何格式化每个值的说明符IndexOf 定位字符串中第一次出现某个给定子字符串或字符的位置IndexOfAny 定位字符串中第一次出现某个字符或一组字符的位置Ins

6、ert 把一个字符串实例插入到另一个字符串实例的指定索引处Join 合并字符串数组,建立一个新字符串LastIndexOf 与 IndexOf 一样,但定位最后一次出现的位置 LastIndexOfAny 与 IndexOfAny,但定位最后一次出现的位置PadLeft 在字符串的开头,通过添加指定的重复字符填充字符串PadRight 在字符串的结尾,通过添加指定的重复字符填充字符串Replace 用另一个字符或子字符串替换字符串中给定的字符或子字符串Split 在出现给定字符的地方,把字符串拆分为一个子字符串数组Substring 在字符串中获取给定位置的子字符串ToLower 把字符串转换

7、为小写形式ToUpper 把字符串转换为大写形式Trim 删除首尾的空白注意:这个表并不完整,但可以让您明白字符串所提供的功能。8.1.1 创建字符串如上所述,string 类是一个功能非常强大的类,它执行许多很有用的方法。但是,string 类存在一个问题:重复修改给定的字符串,效率会很低,它实际上是一个不可变的数据类型,一旦对字符串对象进行了初始化,该字符串对象就不能改变了。表面上修改字符串内容的方法和运算符实际上是创建一个新的字符串,如果必要,可以把旧字符串的内容复制到新字符串中。例如,下面的代码:string greetingText = Hello from all the guys

8、 at Wrox Press. ;greetingText += We do hope you enjoy this book as much as we enjoyed writing it.;在执行这段代码时,首先,创建一个 System.String 类型的对象,并初始化为文本Hello from all the guys at Wrox Press. 。注意句号后面有一个空格。此时 .NET 运行库会为该字符串分配足够的内存来保存这个文本(39 个字符) ,再设置变量 greetingText,表示这个字符串实例。从语法上看,下一行代码是把更多的文本添加到字符串中。实际上并非如此,而是

9、创建一个新字符串实例,给它分配足够的内存,以保存合并起来的文本(共 103 个字符) 。最初的文本Hello from all the people at Wrox Press.复制到这个新字符串中,再加上额外的文本We do hope you enjoy this book as much as we enjoyed writing it.。然后更新存储在变量greetingText 中的地址,使变量正确地指向新的字符串对象。旧的字符串对象被撤销了引用- 不再有变量引用它,下一次垃圾收集器清理应用程序中所有未使用的对象时,就会删除它。这本身还不坏,但假定要对这个字符串加密,在字母表中,用 A

10、SCII 码中的字符替代其中的每个字母(标点符号除外 ),作为非常简单的加密模式的一部分,就会把该字符串变成Ifmmp gspn bmm uif hvst bu Xspy Qsftt. Xf ep ipqf zpv fokpz uijt cppl bt nvdi bt xf fokpzfe xsjujoh ju.。完成这个任务有好几种方式,但最简单、最高效的一种( 假定只使用 String 类)是使用 String. Replace()方法,把字符串中指定的子字符串用另一个子字符串代替。使用Replace(),加密文本的代码如下所示:string greetingText = Hello fr

11、om all the guys at Wrox Press. ;greetingText += We do hope you enjoy this book as much as we enjoyed writing it.;for(int i = z; i=a ; i-)char old1 = (char)i;char new1 = (char)(i+1);greetingText = greetingText.Replace(old1, new1);for(int i = Z; i=A ; i-)char old1 = (char)i;char new1 = (char)(i+1);gre

12、etingText = greetingText.Replace(old1, new1);Console.WriteLine(Encoded:n + greetingText);注意:为了简单起见,这段代码没有把 Z 换成 A,或把 z 换成 a。这些字符分别编码为和。Replace()以一种智能化的方式工作,在某种程度上,它并没有创建一个新字符串,除非要对旧字符串进行某些改变。原来的字符串包含 23 个不同的小写字母,和 3 个不同的大写字母。所以 Replace()就分配一个新字符串,共 26 次,每个新字符串都包含 103 个字符。因此加密过程需要在堆上有一个能存储总共 2678 个字符

13、的字符串对象,最终将等待被垃圾收集!显然,如果使用字符串进行文字处理,应用程序就会有严重的性能问题。为了解决这个问题,Microsoft 提供了 System.Text.StringBuilder 类。StringBuilder 不像String 那样支持非常多的方法。在 StringBuilder 上可以进行的处理仅限于替换和添加或删除字符串中的文本。但是,它的工作方式非常高效。在使用 String 类构造一个字符串时,要给它分配足够的内存来保存字符串,但StringBuilder 通常分配的内存会比需要的更多。开发人员可以选择显式指定 StringBuilder要分配多少内存,但如果没有显

14、式指定,存储单元量在默认情况下就根据 StringBuilder 初始化时的字符串长度来确定。它有两个主要的属性: Length 指定字符串的实际长度; Capacity 是字符串占据存储单元的最大长度。对字符串的修改就在赋予 StringBuilder 实例的存储单元中进行,这就大大提高了添加子字符串和替换单个字符的效率。删除或插入子字符串仍然效率低下,因为这需要移动随后的字符串。只有执行扩展字符串容量的操作,才需要给字符串分配新内存,才可能移动包含的整个字符串。在添加额外的容量时,从经验来看,StringBuilder 如果检测到容量超出,且容量没有设置新值,就会使自己的容量翻倍。例如,如

15、果使用 StringBuilder 对象构造最初的欢迎字符串,可以编写下面的代码:StringBuilder greetingBuilder =new StringBuilder(Hello from all the guys at Wrox Press. , 150);greetingBuilder.AppendFormat(We do hope you enjoy this book as much as we enjoyed writing it); 注意:为了使用 StringBuilder 类,需要在代码中引用 System.Text。在这段代码中,为 StringBuilder 设

16、置的初始容量是 150。最好把容量设置为字符串可能的最大长度,确保 StringBuilder 不需要重新分配内存,因为其容量足够用了。理论上,可以设置尽可能大的数字,足够给该容量传送一个 int,但如果实际上给字符串分配 20 亿个字符的空间(这是 StringBuilder 实例允许拥有的最大理论空间),系统就可能会没有足够的内存。执行上面的代码,首先创建一个 StringBuilder 对象,如图 8-1 所示。图8-1在调用 Append()方法时,其他文本就放在空的空间中,不需要分配更多的内存。但是,多次替换文本才能获得使用 StringBuilder 所带来的性能提高。例如,如果要以前面的方式加密文本,就可以执行整个加密过程,无须分配更多的内存:StringBuilder greetingBuilder =new StringBuilder(Hello from a

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 中学教育 > 其它中学文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号