作为文本处理的利器——Perl语言对正则表达式的最强大支持起到了重要的作用,正因为如此,许多其他语言在加入正则表达式引擎的时候都会或多或少的兼顾perl风格的正则表达式,开发出相应的引擎。本人使用perl语言处理文本有一些时间,同时也有几年php开发的经历,像php就有兼容perl的正则表达式引擎,其对应的正则表达式函数就是以p为前缀,如PReg_replace、preg_match、preg_split。.NET 类库当然也提供了正则表达式的支持,位于System.Text.RegularExpressions命名空间下的Regex类封装了所有正则表达式的属性和使用方法。本文以C#语言详细叙述一下.NET类库下的这个Regex类,可以发现所有的语言对正则表达式的支持都是万变不离其宗,以类比推理的方式学习非常好。
使用过正则表达式的朋友都知道,正则表达式就是指定一个规则去处理一些复杂的文本(如果是简单的处理可以使用一般语言内置的字符串处理函数就可以了,而且效率会更好)。这样需要达到的效果无非就是用一个模式去替换字符串中的特定项为另一特定项、用一个模式去匹配文本中感兴趣的部分内容、用一个特殊的模式去拆分文本。
string text = @"12345qwert"; if (Regex.IsMatch(text, @"[/d]+")) { Console.WriteLine("success"); } else { Console.WriteLine("fail"); }Match函数也是同样的提供了输入字符串匹配,和指定起始位置开始匹配,或者同事指定匹配长度。对应的静态版本类似。匹配成功返回的是一个Match对象,包含了如下信息:包含的匹配信息Capture、匹配得到的对应的分组信息Group,Capture包含了匹配得到的字符串Value、长度Length和在源字符串中的起始位置Index,Group则拥有组名称、是否成功Success,同时Match对象包含了NextMatch属性用于只想下一个匹配得到的Match对象(如果有多个匹配成功项的话),还有Result方法用一个字符串去替换当前匹配到的字符串。Match函数仅返回匹配到的第一个分组,也就是分组0,整个正则表达式匹配到的整体。Matches函数则是同样提供了输入字符串和指定起始位置开始,返回匹配得到的所有Match对象集合。
string text = @"12345qwert67890"; Regex rg = new Regex( @"(?<first>[/d])/d+"); if (rg.IsMatch(text,0)) { MatchCollection mts = rg.Matches(text,0); foreach(Match mt in mts ) { Console.WriteLine("success:" + mt.Value); } } else { Console.WriteLine("fail"); }
string text = @"12345qwert67890"; Regex rg = new Regex( @"(?<first>[/d])/d+"); string [] strArr = rg.Split(text,10); foreach(string str in strArr ) { Console.WriteLine("success:{0}", str); }从上述图中结果可以看出,对于有分组的时候,是按照源字符串中的位置顺序进行匹配都进行拆分。除上述内容外,.NET的Regex类还提供了如下方法:Unescape /Escape——转换输入字符串中的任何转义字符 / 转换普通字符为转义字符CompileToAssembly ——将一个或多个指定的Regex 对象编译为命名程序集GroupNameFromNumber /GroupNumberFromName —— 对命名过的分组得到组号或者相反操作GetGroupNames/GetGroupNumbers —— 返回匹配到的多组匹配项的组号或组名
新闻热点
疑难解答