zoukankan      html  css  js  c++  java
  • 《C#高级编程(第6版)》第8章筆記第8章字符串和正则表达式

    字符串和正则表达式

    创建字符串
    string类存在一个问题:重复修改给定的字符串,效率会很低,它实际上是一个不可变的数据类型,一旦对字符串对象进行了初始化,该字符串对象就不能改变了。
    在使用String类构造一个字符串时,要给它分配足够的内存来保存字符串,但StringBuilder通常分配的内存会比需要的更多。开发人员可以选择显式指定StringBuilder要分配多少内存,但如果没有显式指定,存储单元量在默认情况下就根据StringBuilder初始化时的字符串长度来确定。它有两个主要的属性:

    ● Length指定字符串的实际长度;

    ● Capacity是字符串占据存储单元的最大长度。

    对字符串的修改就在赋予StringBuilder实例的存储单元中进行,这就大大提高了添加子字符串和替换单个字符的效率。删除或插入子字符串仍然效率低下,因为这需要移动随后的字符串。只有执行扩展字符串容量的操作,才需要给字符串分配新内存,才可能移动包含的整个字符串。在添加额外的容量时,从经验来看,StringBuilder如果检测到容量超出,且容量没有设置新值,就会使自己的容量翻倍。

    前面介绍了StringBuilder类,说明了使用它提高性能的一些方式。注意,这个类并不总能提高性能。StringBuilder类基本上应在处理多个字符串时使用。但如果只是连接两个字符串,使用System.String会比较好。

    格式化字符串

    String.Format()现在需要用对应对象的合适字符串表示来替换每个格式说明符,构造最终的字符串。但是,如前所述,对于这个建立字符串的过程,需要StringBuilder实例,而不是String实例。在这个示例中,StringBuilder实例是用字符串的第一部分(即文本"The double is")创建和初始化的。然后调用StringBuilder.AppendFormat()方法,传递第一个格式说明符"{0,10:E}"和相应的对象double,把这个对象的字符串表示添加到构造好的字符串中,这个过程会继续重复调用StringBuilder.Append()和StringBuilder.AppendFormat()方法,直到得到了全部格式化好的字符串为止。

    面的内容比较有趣。StringBuilder.AppendFormat()需要指出如何格式化对象,它首先检查对象,确定它是否执行System命名空间中的接口IFormattable。只要试着把这个对象转换为接口,看看转换是否成功即可,或者使用C#关键字is,也能实现此测试。如果测试失败,AppendFormat()只会调用对象的ToString()方法,所有的对象都从System.Object继承了这个方法或重写了该方法。在前面给出的编写各种类和结构的示例中,执行过程都是这样,因为我们编写的类都没有执行这个接口。这就是在前面的章节中,Object.ToString()的重写方法允许在Console.WriteLine()语句中显示类和结构如Vector的原因。

    但是,所有预定义的基本数字类型都执行这个接口,对于这些类型,特别是这个示例中的double和int,就不会调用继承自System.Object的基本ToString()方法。为了理解这个过程,需要了解IFormattable接口。

    IFormattable只定义了一个方法,该方法也叫作ToString(),它带有两个参数,这与System. Object版本的ToString()不同,它不带参数。


    正则表达式
    正则表达式语言是一种专门用于字符串处理的语言。它包含两个功能:

    ● 一组用于标识字符类型的转义代码。您可能很熟悉DOS表达式中的*字符表示任意子字符串(例如,DOS命令Dir Re*会列出所有名称以Re开头的文件)。正则表达式使用与*类似的许多序列来表示"任意一个字符"、"一个单词"、"一个可选的字符"等。

    ● 一个系统。在搜索操作中,它把子字符串和中间结果的各个部分组合起来。

    使用正则表达式,可以对字符串执行许多复杂而高级的操作,例如:

    ● 区分(可以是标记或删除)字符串中所有重复的单词,例如,把The computer books books转换为The computer books。

    ● 把所有单词都转换为标题格式,例如把this is a Title转换为This Is A Title。

    ● 把长于3个字符的所有单词都转换为标题格式,例如把this is a Title转换为This is a Title。

    ● 确保句子有正确的大写形式。

    ● 区分URI的各个元素(例如http://www.wrox.com/,提取出协议、计算机名、文件名等)。

    当然,这些都是可以在C#中用System.String和System.Text.StringBuilder的各种方法执行的任务。但是,在一些情况下,还需要编写相当多的C#代码。如果使用正则表达式,这些代码一般可以压缩为几行代码。实际上,是实例化了一个对象System.Text.Regular Expressions.RegEx(甚至更简单:调用静态的RegEx()方法),给它传送要处理的字符串和一个正则表达式(这是一个字符串,包含用正则表达式语言编写的指令),就可以了。

    正则表达式字符串初看起来像是一般的字符串,但其中包含了转义序列和有特定含义的其他字符。例如,序列\b表示一个字的开头和结尾(字的边界),如果要表示正在查找以字符th开头的字,就可以编写正则表达式\bth(即序列字边界是- t - h)。如果要搜索所有以th结尾的字,就可以编写th\b(序列t - h-字边界)。但是,正则表达式要比这复杂得多,包括可以在搜索操作中找到存储部分文本的工具性程序。本节仅介绍正则表达式的功能。

    提示:

    正则表达式的更多信息可参阅图书Beginning Regular Expressions(ISBN:978-0-7645-7489-4)。

    申明

    非源创博文中的内容均收集自网上,若有侵权之处,请及时联络,我会在第一时间内删除.再次说声抱歉!!!

    博文欢迎转载,但请给出原文连接。

  • 相关阅读:
    复杂json对应的实体类定义
    Hbase 根据rowkey批量读写
    Spark 分组聚合转Map 的方式
    idea本地连接访问hadoop集群的方法
    新版supperset连接druid数据源设置
    使用jdbc java 连接 sqlserver 2008数据库 需要注意的事项
    关于CrystalQuartz设置Cron匹配的时区问题~
    VS2010连接远程TFS2012项目问题
    关于ASP.NET SignalR的Group使用
    关于CodeFrist下EntityFramework5.0及其最新版本中枚举的使用
  • 原文地址:https://www.cnblogs.com/Athrun/p/1519878.html
Copyright © 2011-2022 走看看