图1:对象关系
把组合字符组合起来后,每次都会返回一个组对象,就可能并不是我们希望的结果。如果希望把组合字符作为搜索模式的一部分,就会有相当大的系统开销。对于单个的组,可以用以字符序列"?:"开头的组禁止这么做,就像URI样例那样。而对于所有的组,可以在RegEx.Matches()方法上指定RegExOptions.ExplicitCapture标志。
4、利用正则表达式实现字符串搜索
4.1 在C#中使用.NET一般表达式引擎
(本文来源于图老师网站,更多请访问http://m.tulaoshi.com/bianchengyuyan/)下面将通过一个样例的开发,执行并显示一些搜索的结果,说明一般表达式的一些特性,以及如何在C#中使用.NET一般表达式引擎。说明使用字符串时应在前面加上符号@。
String Text=@"I can not find my position in Beijing";
把这个文本称为输入字符串,为了说明一般表达式.NET类,本文先进行一次纯文本的搜索,这次搜索不带任何转义序列或一般表达式命令。假定要查找所有字符串ion,把这个搜索字符串称为模式。使用一般表达式和上面声明的变量Text,编写出下面的代码:
String Pattern = "ion";MatchCollection Matches = Regex.Matches(Text,Pattern,RegexOptions);foreach(Match NextMatch in Matches){ Console.WriteLine(NextMatch.Index); }
在这段代码中,使用了System.Text.RegularExpressions名称空间中Regex类的静态方法Match()。这个方法的参数是一些输入文本、一个模式和RegexOptions每句中的一组可选标志。Matches()返回MatchCollection,每个匹配都用一个Match对象来表示。在上面的代码中,只是在集合中迭代,使用Match类的Index属性,返回输入文本中匹配所在的索引。运行这段代码,将得到1个匹配项。
一般集合的功能主要取决于模式字符串。原因是模式字符串不仅仅包含纯文本。如前所述。还包含元字符和转义序列,元字符是给出命令的特殊字符,而转义序列的工作方式与C#的转义序列相同,它们都是以反斜杠开头的字符,具有特殊的含义。例如,假定要查找以n开头的字,就可以使用转义序列b,它表示一个字的边界(字的边界是以某个字母数字标的字符开头,或者后面是一个空白字符或标点符号),下面编写如下代码:
String Pattern = @"bn";MatchCollection Matches = Regex.Matches(Text,Pattern,RegexOptions.IgnoreCase|RegexOptions.ExplicitCapture);
要在运行时把b传递给.NET一般表达式引擎,反斜杠不应被C#编译器解释为转义序列。如果要查找以序列ion结尾的字,可以使用下面的代码:
String Pattern = @"ionb";
如果要查找以字母n开头,以序列ion结尾的所有字,需要一个以bn开头,以ionb结尾的模式,中间内容怎么办?需要告诉计算机n和ion中间的内容可以是任意长度的字符,只要字符不是空白即可,正确的模式如下所示:
String Pattern = @"bnS*ionb";
4.2 特定字符或转义序列
大多数重要的正则表达式语言运算符都是非转义的单个字符。转义符 (单个反斜杠)通知正则表达式分析器反斜杠后面的字符不是运算符。例如,分析器将星号 (*) 视为重复限定符,而将后跟星号的反斜杠 (*) 视为 Unicode 字符 002A。
使用一般表达式要习惯的一点是,查看像这样怪异的字符序列,但这个序列的工作是非常逻辑化的。转义序列S表示任何不适空白的字符。*称为数量词,其含义是前面的字符可以重复任意次,包括0次。序列S*表示任何不适空白的字符。因此,上面的模式匹配于以n开头,以ion结尾的任何单个字。下表中列出的字符转义在正则表达式和替换模式中都会被识别。
表1:特定字符或转义序列
特定字符或转义序列含义样例 匹配的样例^ 输入文本的开头^B B,但只能是文本中的第一个字符$ 输入文本的结尾X$X,但只能是文本中的最后一个字符. 除了换行字符(n)以外的所有单个字符i.ationisation、ization* 可以重复0次或多次的前导字符ra*trat、raat等+ 可以重复1次或多次的前导字符ra+trt、rat、raat等?可以重复0次或1次的前导字符ra?t 只有rt和rat匹配s 任何空白字符 sa [space]a,ta,na(t和n与C#的t和n含义相同)S 任何不是空白的字符SFaF,rF,cF,但不能是tfb 字边界ionb以ion结尾的任何字B 不是字边界的位置 BXB 字中间的任何X
如果要搜索一个元字符,也可以通过带有反斜杠的转义字符来表示。例如,.表示除了换行字符以外的任何字符,而.表示一个点。
可以把可替换的字符放在方括号中,请求匹配包含这些字符。例如,[1|c]表示字符可以是1或者是c。如果要搜索map或者man,可以使用序列"ma[n|p]"(仅指引号内字符,下面雷同)。在方括号中,也可以制定一个范围,例如"[a-z]"表示所有的小写字母(使用连字号 (-) 允许指定连续字符范围),"[B-F]"表示B到F之间的所有大写字母,"[0-9]"表示一个数字,如果要搜索一个整数(该序列只包含0到9的字符),就可以编写"[0-9]+"(注意,使用+字符表示至少要有这样一个数字,但可以有多个数字,所以9、83和3443等都是匹配的。)