摘要:本文给出了在C#下利用正则表达式实现字符串搜索功能的方法,通过对.NET框架下的正则表达式的研究及实例分析,总结了正则表达式的元字符、规则、选项等.1、正则表达式简介正则表达式提供了功能强大、灵活而又高效的方法来处理文本.正则表达式的全面模式匹配表示法可以快速地分析大量的文本以找到特定的字符模式;提? ⒈嗉⑻婊换蛏境谋咀幼址?或将提取的字符串添加到集合以生成报告.对于处理字符串(例?HTML 处理、日志文件分析和 HTTP 标头分析)的许多应用程序而言,正则表达式是不可缺少的工具..NET 框架正则表达式并入了其他正则表达式实现的最?δ?被设计为?Perl 5 正则表达式兼容,.NET 框架正则表达式还包括一些在其他实现中尚未提供的功能,.NET 框架正则表达式类是基类库的一部分,并且可以和面向公共语言运行库的任何语言或工具一起使用.
2、字符串搜索 正则表达式语言由两种基本字符类型组成:原义(正常)文本字符和元字符.正是元字符组为正则表达式提供了处理能力.当前,所有的文本编辑器都有一些搜索功能,通常可以打开一个对话框,在其中的一个文本框中键入要定位的字符串,如果还要同时进行替换操作,可以键入一个替换字符串,比如在Windows操作系统中的记事本、Office系列中的文档编辑器都有这种功能.这种搜索最简单的方式,这类问题很容易用String类的String.Replace( )方法来解决,但如果需要在文档中识别某个重复的,该怎么办?编写一个例程,从一个String类中选择重复的字是比较复杂的,此时使用语言就很适合.一般表达式语言是一种可以编写搜索表达式的语言.在该语言中,可以把文档中要搜索的文本、转义序列和特定含义的其他字符组合在一起,例如序列表示一个字的开头和结尾(子的边界),如果要表示正在查找的以字符th开头的字,就可以编写一般表达式th(即序列字符界是-t-h).如果要搜索所有以th结尾的字,就可以编写th(序列t-h-字边界).但是,一般表达式要比这复杂得多,例如,可以在搜索操作中找到存储部分文本的工具性程序(facility).
3、.NET 框架的正则表达式类 下面通过介绍 .NET 框架的正则表达式类,熟悉一下.NET框架下的正则表达式的使用方法.3.1 Regex 类表示只读正则表达式Regex 类包含各种静态方法,允许在不显式实例化其他类的对象的情况下使用其他正则表达式类.以下代码示例创建了 Regex 类的实例并在初始化对象时定义一个简单的正则表达式.请注意,使用了附加的反斜杠作为转义字符,它将 s 匹配字符类中的反斜杠指定为原义字符.Regex r;// 声明一个 Regex类的变量r = new Regex( // 定义表达式3.2 Match 类表示正则表达式匹配操作的结果 以下示例使用 Regex 类的 Match 方法返回 Match 类型的对象,以便找到输入字符串中第一个匹配.此示例使用 Match 类的 Match.Success 属性来指示是否已找到匹配.Regex r = new Regex( // 定义一个Regex对象实例Match m = r.Match( // 在字符串中匹配if ( m.Success ) { Console.WriteLine( //输入匹配字符的位置}3.3 MatchCollection 类表示非重叠匹配的序列 该集合为只读的,并且没有公共构造函数.MatchCollection 的实例是由 Regex.Matches 属性返回的.使用 Regex 类的 Matches 方法,通过在输入字符串中找到的所有匹配填充 MatchCollection.下面代码示例演示了如何将集合复制到一个字符串数组(保留每一匹配)和一个整数数组(指示每一匹配的位置)中.MatchCollection mc;String[] results = new String[20];int[] matchposition = new int[20];Regex r = new Regex( //定义一个Regex对象实例mc = r.Matches( //在输入字符串中找到所有匹配{ results[i] = mc[i].Value; //将匹配的字符串添在字符串数组中 matchposition[i] = mc[i].Index; //记录匹配字符的位置}3.4 GroupCollection 类表示捕获的组的集合 该集合为只读的,并且没有公共构造函数.GroupCollection 的实例在 Match.Groups 属性返回的集合中返回.下面的控制台应用程序查找并输出由正则表达式捕获的组的数目. using System;using System.Text.RegularExpressions;public class RegexTest { public static void RunTest( ) { Regex r = new Regex( //定义组 Match m = r.Match( //查找//设定要查找的字符串 gc = m.Groups; //输出查找组的数目 Console.WriteLine( // Loop through each group. for ( int i=0; i < gc.Count; i++ ) //查找每一个组 { cc = gc[i].Captures; counter = cc.Count; Console.WriteLine( // Pr int capture and position. Console.WriteLine( cc[ii] + //输入捕获位置 } } } public static void Main( ) { RunTest( ); }}此例返回下面的输出结果:Captured groups = 2Captures count = 1AbcAbcAbc Starts at character 3Captures count = 3Abc Starts at character 3Abc Starts at character 6Abc Starts at character 93.6 Capture 类包含来自单个子表达式捕获的结果 在 Group 集合中循环,从 Group 的每一成员中提取 Capture 集合,并且将变量 posn 和 length 分别分配给找到每一字符串的初始字符串中的字符位置,以及每一字符串的长度.Regex r;Match m;CaptureCollection cc;int posn, length;r = new Regex( //捕获对象位置 length = cc[j].Length; //捕获对象长度 }}
图1:对象关系把组合字符组合起来后,每次都会返回一个组对象,就可能并不是我们希望的结果.如果希望把组合字符作为搜索模式的一部分,就会有相当大的系统开销.对于单个的组,可以用以字符序列