正则表达式作为小型技术领域的一部分,在各种程序中都有着难以置信的作用。正则表达式可以看成一种有特定功能的小型编程语言:在大的字符串表达式中定位子字符串。它不是一种新技术,最初是在UNIX环境中开发的,与Perl和JavaScript编程语言一起使用的比较多。System.Text.RegularExpressions名称空间中的许多.Net类都支持正则表达式。.Net Framework的各个部分也使用正则表达式。例如,在ASP.NET验证服务器的控件中就使用了正则表达式。
对不太熟悉正则表达式语言的开发者来说,下面将主要解释正则表达式和相关的.Net类。
注:.Net正则表达式引擎用于兼容Perl 5的正则表达式,但它有一些新功能。
概述
正则表达式语言是一种专门用于字符串处理的语言。它包含两个功能:
- 一组用于标识特殊字符类型的转义代码。你可能熟悉DOS命令中的使用*字符表示任意子字符串(例如,DOS命令 Dir Re*会列出名称以Re开头的所有文件)。正则表达式使用与*类似的许多序列来表示“任意一个字符”、“一个单词的中断”和“一个可选的字符”等。
- 一个系统,在搜索操作中把子字符串和中间结果的各个部分组合起来。
使用正则表达式,可以对字符串执行许多复杂而高级的操作,例如:
- 识别(可以是标记或删除)字符串中的所有重复单词,例如,把“The computer books books”转换为“The computer books”。
- 把所有单词都转换为标题格式,例如,把“this is a Title”转换为“This Is A Titlte”。
- 把长于3个字符的所有单词都转换为标题格式,例如,把"this is a Title"转换为"This is a Title"。
- 确保句子有正确的大写形式。
- 区分URI的各个元素(例如,给定http://www.wrox.com,提取出其中的协议、计算机名和文件名等)。
当然,这些都是可以在C#中用System.String和System.Text.StringBuilder的各种方法执行的任务。但是,在一些情况下,还需要编写相当多的C#代码。如果使用正则表达式,这些代码一般可以压缩为几行。实际上,这是实例化了一个对象System.Text.RegularExpressions.Regex(甚至更简单,调用Regex的静态方法),给它传递要处理的字符串和一个正则表达式(这是一个字符串,它包含用正则表达式语言编写的指令)。
正则表达式字符串初看起来像一般的字符串,但其中包含了转移序列和有特定含义的其他字符。例如,序列\b表示一个字的开头和结尾(字的边界),因此如果要表示正在查找以字符th开头的字,就可以编写正则表达式\bth(即字边界是序列-t-h)。如果要搜索所有以th结尾的单词,就可以编写th\b(字边界是序列t-h-)。但是,正则表达式要比这复杂的多,包括可以在搜索操作中找到存储部分文本的工具性程序。这里仅简要介绍正则表达式的功能。
假定应用程序需要把美国的电话号码转换为国际格式。在美国,电话号码的格式为314-123-1234,常常写作(314)123-1234。在把这个国家格式转换为国际格式时,必须在电话号码的前面加上+1(美国的国家代码),并给区号加上圆括号:+1(314) 123-1234。在查找和替换时,这并不复杂。但如果要使用String类完成这个转换,就需要编写一些代码。而正则表达式语言可以构造一个短的字符串来表达上述含义。
这里实例是一个非常简单的示例,只考虑如何查找字符串中的某些子字符串,不需要考虑如何修改他们。
public static void Find1(text)
{
const string pattern = "ion";
MatchCollection matches = Regex.Matches(text,pattern,RegexOptions.IgnoreCase|RegexOptions.ExplicitCapture);
WriteMatches(text,matches);//此为后面编写的一个输出匹配结果的方法
}
为了说明.Net类的正则表达式,我们先进行一次纯文本的基本搜索,这次搜索不带任何转义序列或正则表达式命令。假定要查找所有的字符串ion,把这个搜索字符串称为模式。
在这段代码中,使用了System.Text.RegularExpressions名称空间中的Regex类的静态方法Matches()。这个方法的参数是一些输入文本、一个模式和从RegexOptions枚举中提出的一组可选标志。在本例中,指定所有的搜索都不应区分大小写。另一个标记ExplicitCapture改变了收集匹配的方式,对于本例,这样可以使搜索的效率更高。Matches()方法返回MatchCollection对象的引用。匹配是一个技术术语,表示在表达式中查找模式实例的结果,用System.Text.RegularExpressions.Match类表示它