C#字符串和正则表达式参考手册

来源:互联网 发布:oracle sql sequence 编辑:程序博客网 时间:2024/05/04 00:35

【书名    】:C#字符串和正则表达式参考手册
【出版社  】:清华大学出版社
【作者    】:Francois Liger,Craig McQueen,Paul Wilton
【评价    】:★★★★★★☆☆☆☆
【正文    】:

----------------------------------------------------------------------------------------------------
0001:
    匹配的意思是检查一个字符串是否遵守一定的模式。
----------------------------------------------------------------------------------------------------
0002:
    值类型的容量是已知的。
----------------------------------------------------------------------------------------------------
0003:
    所有的基本数据类型都允许通过写入字面量而创建值。
----------------------------------------------------------------------------------------------------
0004:
    Unicode文本文件的容量是ASCII文件容量的两倍,其内存空间也是如此。
----------------------------------------------------------------------------------------------------
0005:
    Char.IsDigit();//判断是否属于十进制的数字
    Char.IsLetter();//判断是否是字母类型
    Char.IsLetterOrDigit();//判断是否是字母或数字
    Char.IsLower();//判断是否是小写
    Char.IsNumber();//判断是否是数字
    Char.IsPunctuation();//是否是标点符号
    Char.IsSymbol();//是否是符号
    Char.IsUpper();//是否是大写
    Char.IsWhiteSpace();//是否是空白
----------------------------------------------------------------------------------------------------
0006:
    如果希望了解字符在内存中的表示方式,可以将这些字符写入文件,然后使用二进制编辑器查看这些字符。文
件中的字节就是在内存中存储的字节。
----------------------------------------------------------------------------------------------------
0007:
    Microsoft Automation使用的是Unicode,也就是BSTR(Binary Strings,二进制字符串)。BSTR以空字符为结
束标记。但是,用户可以查询其长度,而无需扫描字符串。其长度值存储为32位的整数值,存储为止在内存中该字
符串数据之前。BSTR理论上的最大长度是42.9亿,但是,操作系统可以根据所使用的资源决定实际可达到的长度。
Automation字符串高速缓存被设计成以最有效的方式操作字符串。较长的字符串在堆中分配,对其进行连接要花费
相当长的时间。这意味着首先连接较小的字符串可以显著提高操作性能,因为这样可以使用高速缓存。
----------------------------------------------------------------------------------------------------
0008:
    CLR自动维护一个内置池的表,此表包含程序中声明的每个惟一的字面字符串常量的单个实例,以及以编程方式
创建的System.String类的任何惟一实例。内置池实现为散列表。使用散列表意味着,一个字符串可以通过一个数字
或散列码来表示。这样比较和搜索字符串就非常有效,因为这不是逐个字符地比较字符串,而仅仅是比较散列值。
内置池节省字符串存储空间。如果将一个字面字符串常量赋给几个变量,则每一个变量引用内置池中相同的常量,
而不是引用具有相同值的String类的几个不同实例。
    使用StringBuilder类创建的字符串可以使用Intern()方法手工添加到内置池中。
----------------------------------------------------------------------------------------------------
0009:
    考虑单词“exposition”和“exposure”,如果单独存储,则需要的存储空间是18个字符,然后使用指针指向
各个单词中的其它字符。这就将存储的字符数量减少为13个字符。当要存储大量单词时,所节省的内存总量就非常
客观。
----------------------------------------------------------------------------------------------------
0010:
    字符串操作的性能问题,简化为两个基本问题:内存分配和字节复制。所以,通过实现策略将内存分配和字节
复制最小化,性能就会提高。为了减少内存重新分配和字节复制的数量,可以分配比最初所需更多的空间。这样,
当字符串增加时,就只需将新的字符复制到已经分配好的空间中。这个策略通常用来提高性能。
----------------------------------------------------------------------------------------------------
0011:
    String定义为不可改变,它就可以具有值的语义,但仍保持为引用类型。
----------------------------------------------------------------------------------------------------
0012:
    String类和实例的常用方法:
    String.Compare();//比较字符串
    String.Intern();//如果字符串不是内置的,将字符串内置
    str.EndsWith();//以某个符号结尾
    str.Substring();//截取字符串
    str.Replace();//替换字符串中的字符
    str.Split();//按照给定的字符分割符将实例字符串分离
----------------------------------------------------------------------------------------------------
0013:
    系统如果在编译时知道一个字符串中的字符是什么,就会内置这个字符串。
----------------------------------------------------------------------------------------------------
0014:
    对于单一的连接,不要使用StringBuilder,因为创建对象所耗费的系统开销会超出连接所带来的性能上的收益。
----------------------------------------------------------------------------------------------------
0015:
    性能测试的简单实现:
    int startTime = 0;
    int endTime = 0;
    int countTime = 0;

    startTime = System.Environment.TickCount;//系统启动后经过毫秒数
    for (int i = 0; i < 10; i++)
    {
        System.Threading.Thread.Sleep(10);
    }
    endTime = System.Environment.TickCount;

    countTime = endTime - startTime;

    Console.WriteLine(countTime);
----------------------------------------------------------------------------------------------------
0016:
    String.Compare();//类的静态方法
    str.CompareTo();//实例方法
    Compare方法总比CompareTo方法的性能要好一些,因为不用创建实例。String.CompareOrdinal()方法的速度是
最快的,因为此方法不用考虑文化方面的信息。它没有执行转换和提供国际支持所需要的系统开销。这个方法可以
用于那些不会本地化的字符串,比如各种操作系统和网络变量。
----------------------------------------------------------------------------------------------------
0017:
    在比较两个对象时,若比较它们的散列码,这个比较将会执行得最好,它将是一个非常迅速的操作。如果两个
字符串是相同的,它们也会具有相同的散列码,因此相等测试进行得非常迅速。
----------------------------------------------------------------------------------------------------
0018:
    程序设计并不是只追求性能,在性能不是问题的情况下,可读性最重要。
----------------------------------------------------------------------------------------------------
0019:
    优化字符串操作的技巧:
    ●尽可能把字符串存储为常量,这会保证使用内置池,同时最小化所需机器指令的数量。
    ●如果String类能够有效工作,就不要使用StringBuilder。例如一个单独字符串的赋值操作。
    ●如果要循环建立一个庞大的字符数据块,就使用StringBuilder。
    ●如果需要国际化的字符串,就只能使用方法Compare()。否则,使用CompareOrdinal()方法。
    ●如果只需知道字符串是否相同,就应使用方法Equals(),而不是CompareOrdinal()方法。
    ●通常情况下使用Equals方法,而不是使用“==”运算符。
----------------------------------------------------------------------------------------------------
0020:
    格式说明符和用法示例:不区分大小写
    ●C:货币记数
    ●D:小数记数
    ●E:科学记数
    ●F:定点记数
    ●G:通用记数
    ●N:数字形式
    ●X:十六进制形式
    ●P:百分数
    ●R:往返,它可以保证字符串表示能转换回数字形式。适用于Double类型而不适用于Integer类型
----------------------------------------------------------------------------------------------------
0021:
    日期类型的创建:
    String myStr = "2007/10/1";
    DateTime myDate = DateTime.Parse(myStr);
    Console.WriteLine(myDate.ToString());
----------------------------------------------------------------------------------------------------
0022:
    一个数组只能包含相同类型的元素。这是因为.NET Framework更愿意知道数组的确切大小。值类型是固定长度
的,所以,一个包含10个整数的数组,将占用40个字节的内存。这就是说,堆可以准确地分配数组所需要的空间。
一个包含10个字符串的数组所占用的内存与一个包含10个整数的数组所占用的内存是相同的,因为引用也是32位的。
由于所有的引用都是相同的,所以就可以定义一个System.Object类型的数组,它对于字符串和所有其他对象都将会
分配相同数量的内存。
----------------------------------------------------------------------------------------------------
0023:
    ArrayList是数组环境下的StringBuilder。像StringBuilder一样,在使用默认构造函数时,初始化可以使用16
个元素,而且它还允许把一个值传递到它的构造函数,这样就可以指定调整它的大小以包含不同数量的元素。ArrayList
存储任何System.Object类型的对象。这是很有利的一点,因为它意味着任何对象都可以含进来,但同时也是一个负
担,因为返回的对象总是需要转换成它的原始类型,这样编译器才不会抱怨开发人员希望执行的操作。
----------------------------------------------------------------------------------------------------
0024:
    目前的计算机还只能对数字直接进行操作,所以,计算机通过为每一个字符分配一个数值的方式来处理字母、
数字和其他字符。这是通过编码实现的,编码就是把字符与任意值匹配起来的方式。传统上,根据ASCII标准,字符
存储为0~127的二进制数。
----------------------------------------------------------------------------------------------------
0025:
    UTF-16是最常见的Unicode编码。.NET中的字符串使用UTF-16编码。当开发者需要使用固定宽度的字符,就可以
用到UTF-32,它使用32位为所有的Unicode字符编码。但是,使用此格式的代价是很高的,因为每一个字符都占用4
个字节,.NET并没有内置对UTF-32格式的支持。
----------------------------------------------------------------------------------------------------
0026:
    输入法编辑器:IEM,Input Method Editor
----------------------------------------------------------------------------------------------------
0027:
    匹配符号:
    /d:    从0~9的任一数字,例如/d/d可以匹配72,但不匹配aa或7a
    /D:    非数字字符,例如/D/D/D匹配abc,但不匹配123
    /w:    任一单词字符,如A-Z、a-z、0-9和下划线字符,例如/w/w匹配A_,但不匹配*%
    /W:    非单词字符,/W可以匹配@,但不匹配a
    /s:    任一空白字符,包括制表符,换行符,回车符,换页符和垂直制表符
    .:     任一字符,换行符除外
    [...]: 括号中的任一字符,例如[abc]匹配单个字符a、b、c,但不匹配其他字符,[a-z]匹配a~z的任一字符
    [^...]:非括号中的任一字符,[^abc]匹配a、b、c除外的任一字符,但可以匹配A、B和C
----------------------------------------------------------------------------------------------------
0028:
    定位符号:
    ^:     其后的模式必须在字符串的开始处,如果是一个多行字符串,应位于任一行的开始。对于多行文本(
            包含回车符的字符串),需要设定Multiline标志。
    $:     前面的模式必须在字符串的末尾处,如果是一个多行字符串,因该在任一行的末尾。
    /A:    前面的模式必须在字符串的开始处,多行标志被忽略。
    /z:    前面的模式必须在字符串的末尾处,多行标志被忽略。
    /Z:    前面的模式必须位于字符串的末尾,或是位于换行符前。
    /b:    匹配一个单词边界,实质上是单词字符和非单词字符间的点。位于一个单词的开始。
    /B:    匹配一个非单词边界的位置,不在一个单词的开始。
----------------------------------------------------------------------------------------------------
0029:
    指定重复字符:
    {n}:   匹配前面的字符n次,例如x{2}匹配xx,但不匹配x或xxx。
    {n,}:  匹配前面的字符n次或更多,例如x{2,}匹配2个或更多的x。
    {n,m}: 匹配前面的字符n次到m次之间。
    ?:     匹配前面的字符0次或1次,可以省略。
    +:     匹配前面的字符1次或多次。
    *:     匹配前面的字符0次或多次。
----------------------------------------------------------------------------------------------------
0030:
    010-87654321匹配的模式:^/d{3,4}-/d{7,}$
----------------------------------------------------------------------------------------------------


本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/yuanfang8789/archive/2007/08/20/1751750.aspx