C#高级编程--字符串和正则表达式

来源:互联网 发布:不可饶恕 韩国 知乎 编辑:程序博客网 时间:2024/06/06 00:24

System.String是一个功能非常强大且用途非常广泛的基类,但它不是.NET中唯一与字符串相关的类,特别是System.Text和System.Text.RegularExpressions命名空间中的类。本文主要介绍内容:
1、创建字符串
2、格式化表达式
3、正则表达式

一、System.String类

System.String是一个类,专门用于存储字符串,允许对字符串进行许多操作。
例如:

string messsage1 = "Hello"// return "Hello"
message1 += ", There"// return "Hello, There"
string message2 = message1 + "!" //return "Hello, There!"

C#还允许类似于索引符的语法来提取指定的字符:

char char4 = "message"[4]; //return 'a'

C#字符串常用的主法:
方法 作用 Compare 比较字符串内容,考虑文化北背(场所),确定某些字符串是否相等 CompareOrdinal 与Compare一样,但不考虑文化背景 Format 格式化包含各种值的字符串以及如何格式化每个值的说明符 IndexOf 定位字符串中第一次出现某个给定子字符串或字符的位置 IndexOfAny 定位字符串中第一次出现某个字符或一组字符的位置 LastIndexOf 与IndexOf一样,但定位最后一次出现的位置 LastIndexOfAny 与IndexOfAny,但定位最后一次出现的位置 PadLeft 在字符串的开头,通过添加指定的重复字符填充字符串 PadRight 在字符串的结尾,通过添加指定的重复字符填充字符串 Replace 用另一个字符或子字符串替换字符串中给字的字符或子字符串 Split 在出现给定字符的地方,把字符串拆分为一个子字符串数组 Substring 在字符串中获取给定位置的子字符串 ToLower 把字符串转换为小写形式 ToUpper 把字符串转换为大写形式 Trim 删除首尾的空白
1.1 创建字符串

string类的功能非常强大,但是它存在一个问题:重复修改给定的字符串,效率很低。它实际上是一个不可变的数据类型,一旦对字符串进行了初始化,该字符串就不能改变了。修改该字符串的内容时,实际上是创建一个新的字符串,如果有必要,可以把旧的字符串内容复制到新字符串中。
例如:

string greetingText= "Hello. ";
greetingText 
+= "This is source code";

在执行这段代码时,首先创建一个String对象greetingText,并初始化为文本"Hello. "(最后是一个空格)。此时.NET运行库为该字符串分配足够的内存在保存初始文本(7个字符),再设置变量greetingText,表示这个字符串实例。从表面上看,执行下一句代码,是把新的文本直接添加到初始文本的后面,但实际并非如此执行的。而是另外创建一个新的字符串实例,给他分配足够的内存,以保存合并起来的文本,然后更新存储再变量greetingText中的地址,使变量指向新的字符串对象。旧的字符串对象被撤销了引用——不再有变量引用它,下一次垃圾收集器清理应用程序中所有未使用的对象时,就会删除它。

当字符串的长度很大的时候,这样做显然影响了执行效率,所以C#中用System.Text.StringBuilder类来处理较长的字符串。StringBuilder类功能没有String类强大,功能仅限于替换和添加或删除字符串中的文本,但是工作方式非常高效。
用StringBuilder类创建字符串:

StringBuilder greetingBuilder = new StringBuilder("Hello from all the guys at Wrox Press. "150);//显示给定初始文本内容和分配内存长度

StringBuilder message 
= new StringBuilder("Hello");//仅仅给出字符串,系统自动分配内存

StringBuilder message2 
= new StringBuilder(20);//给指定容量创建一个空的StringBuiler 


StringBuiler类有两个主要属性:
Length指定字符串的实际长度
Capacity是字符串占据存储单元的长度
StringBuilder类的主要方法:
Append()方法,在字符串尾部添加新的文本
Replace()方法,替换文本

注意:不能把StringBuilder转换为String,如果要把StringBuilder的内容输出为String,唯一的方式是使用ToString()方法。

1.2 格式化字符串

double d = 13.45;
int i = 45;
sting result 
= String.Format("The double is {0,10:E} and the int contains {1}",d,i);

{}中的0、1等分别对应后面的d和i,10:E是格式,表示占10个字符,如果数字是正数,结果向右对齐,如果是负数则左对齐。E表示科学计数法。
格式符 应用 含义 示例 C 数字类型 专用场合的货币值 $4834.50(USA) D 只用于整数类型 一般的整数 4834 E 数字类型 科学计数法 4.834E+003 F 数字类型 小数点后的位数固定 4834.50 G 数字类型 一般的数字 4834.5

N

数字类型 通常是专用场合的数字格式 4,834.50 P 数字类型 百分比计数法 432,000.00% X 只用于整数类型 16进制格式 1120(如果需要显示0x1120,需要写上0x)
二、正则表达式

2.1 正则表达式概述

正则表达式语言是一种专门用于字符串处理的语言,使用正则表达式可以对字符串执行许多复杂而高级的操作,例如:区分URI的各个元素(例如:http://www.sina.com.cn,提取协议、计算机名、文件名等)。
在C#中只需要用System.Text.RegularExpressions类的RegEx()方法或者调用静态方法RegEx(),给它们传递要处理的字符串和一个正则表达式,就可以完成我们所需要的操作,得到预期的结果了。
下面列出正则表达式常用字符表
符号 含义 示例 匹配示例 ^ 输入文本的开头 ^B B,但只能是文本中的第一个字符 $ 输入文本的结尾 X$ X,但只能是文本的最后一个字符 . 除了换行符(/n)以外的所有单个字符 i.ation isation、ization * 可以重复0次或者多次的前导字符 ra*t rt、rat、raat、raaat等 + 可以重复1次或者多次的前导字符 ra+t rat、raat和raaat等(不包含rt) ? 可以重复0次或者1次的前导字符 ra?t rt或者rat /s 任何空白字符 /sa [space]a、/ta、/na等 /S 任何不是空白的字符 /SF

aF、rF、cF等,但不能是/tF

/b 字边界 ion/b 以ion结尾的任何字 /B 是不是字边界的位置 /BX/B 字中间的任何X 如果搜索一个元字符,可以用.(一个句点)表示所有除了/n以外的字符,而/.表示一个点。
可以把要替换的字符放到括号中:[1|C]表示字符可以是1或者C,如果要搜索map或者man,可以用ma[n|p]。
方括号也可以表示范围:[a-z]表示a到z的所有小写字母。

示例如下:

string Text = @"This comprehensive compendium provides a broad and thorough investigation of all aspects of programming with ASP.NET";
string pattern = @"/ba";//查找所有以a开头的字符
MatchCollection matches = Regex.Matches(Text, pattern, RegexOptions.IgnoreCase);
原创粉丝点击