作为文本处理的利器——Perl语言对正则表达式的最强大支持起到了重要的作用,正因为如此,许多其他语言在加入正则表达式引擎的时候都会或多或少的兼顾perl风格的正则表达式,开发出相应的引擎。本人使用perl语言处理文本有一些时间,同时也有几年php开发的经历,像php就有兼容perl的正则表达式引擎,其对应的正则表达式函数就是以p为前缀,如preg_replace、preg_match、preg_split。.NET 类库当然也提供了正则表达式的支持,位于System.Text.RegularExpressions命名空间下的Regex类封装了所有正则表达式的属性和使用方法。本文以C#语言详细叙述一下.NET类库下的这个Regex类,可以发现所有的语言对正则表达式的支持都是万变不离其宗,以类比推理的方式学习非常好。

使用过正则表达式的朋友都知道,正则表达式就是指定一个规则去处理一些复杂的文本(如果是简单的处理可以使用一般语言内置的字符串处理函数就可以了,而且效率会更好)。这样需要达到的效果无非就是用一个模式去替换字符串中的特定项为另一特定项、用一个模式去匹配文本中感兴趣的部分内容、用一个特殊的模式去拆分文本。

  • 构造函数:用于构造一个正则表达式对象,源码的声明如下:
其中声明为public的构造函数是可以直接使用的,前者使用一个正则表达式字符串构造,后者使用正则表达式字符串和表达式选项构造对象。其中正则表达式选项RegexOptions是一个枚举类型,用于设置正则表达式的模式修正,C#的这个选项有如下项目:
Multiline —— 将字符串视为多行,“.”就不能匹配换行符(掩码为2)
Singleline—— 将字符串视为单行,“.”就可以匹配换行符(掩码为16)
IgnorePatternWhitespace —— 忽略模式表达式中的非转义空白,并启用#表示的注释(掩码为32)
None —— 不设置选项(掩码为0)
IgnoreCase —— 忽略字符串中的大小写(掩码为1)
RightToLeft —— 将默认的从左至右的搜索改为从右至左(掩码为64)
Compiled —— 将正则表达式编译为程序集,可以加快运行速度,但是会增加启动时间(掩码为8)
CultureInvariant —— 忽略语言中的区域性差异(掩码为512)
ExplicitCapture —— 指定有效的捕获仅为形式为 (?<name>...) 的显式命名或编号的组,使得未命名的圆括号可以充当非捕获组(掩码为4)
ECMAScript —— 为表达式启用符合 ECMAScript 的行为,只能与IgnoreCase、Multiline和Compiled选项一起使用(掩码为256)
上述选项都是使用掩码方式存储的,因此多个选项选择的时候直接使用按位与“|”操作符连接起来即可。
  • 匹配(Match):使用模式进行匹配的时候,.NET提供了IsMatch和Match以及Matches三个函数,第一个返回布尔值用来表示是否匹配成功,第二个则是返回匹配得到的结果Match对象,包含了匹配的结果内容,第三个则是返回一个Match对象的集合,包含了所有匹配的对象。上述函数的所有声明如下:
IsMatch提供了一个对输入字符串进行匹配和指定起始位置匹配,同时也提供了对应的静态函数,用于省去构造对象的麻烦,直接传入模式进行匹配。使用如下代码得到的结果如下图。
            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");
}

  • 替换(Replace):其实在Match函数中也提供了Result方法用来替换匹配项,但是功能不够充分,以下是Regex类中的替换方法:
替换方法Replace方法可以直接对输入文本替换成给定的文本,也有指定替换次数和起始位置。同时可以使用MatchEvaluator对象进行替换,此对象使用Replace单词匹配到的Match对象为参数的一个委托,对每个匹配项进行替换。对于简单的替换可以直接使用字符串参数替换匹配项以及指定替换次数或者起始位置,但是对于复杂的匹配则要使用MatchEvaluator委托进行,可以参考http://www.dotnetperls.com/regex-replace
  • 分割(Split):分割为找到匹配项后以此阶段源字符串,返回字符数组。定义如下:
这个方法的定义比较简单,就是找到匹配项然后从此字符串拆分获取拆分的结果,同时可以指定拆分的数组元素个数。测试如下:
            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 —— 返回匹配到的多组匹配项的组号或组名

C#正则表达式Regex类使用的更多相关文章

  1. C#正则表达式Regex类的用法

    C#正则表达式Regex类的用法 更多2014/2/18 来源:C#学习浏览量:36891 学习标签: 正则表达式 Regex 本文导读:正则表达式的本质是使用一系列特殊字符模式,来表示某一类字符串, ...

  2. C#正则表达式Regex类

    C#正则表达式Regex类的使用 C#中为正则表达式的使用提供了非常强大的功能,这就是Regex类.这个包包含于System.Text.RegularExpressions命名空间下面,而这个命名空间 ...

  3. C#正则表达式Regex类的介绍

    一.在C#中,要使用正则表达式类,请在源文件开头处添加以下语句: using System.Text.RegularExpressions; 二.RegEx类常用的方法 1.静态Match方法 使用静 ...

  4. C#正则表达式Regex类的使用

    C#中为正则表达式的使用提供了非常强大的功能,这就是Regex类.这个包包含于System.Text.RegularExpressions命名空间下面,而这个命名空间所在DLL基本上在所有的项目模板中 ...

  5. (转)C#正则表达式Regex类的用法

    原文地址如下:http://www.studyofnet.com/news/297.html 一.C#正则表达式符号模式 字 符 描 述 \ 转义字符,将一个具有特殊功能的字符转义为一个普通字符,或反 ...

  6. 用Regex类计算一个字符串出现次数是最好方法【转载】

    我的一个朋友问我,怎么在c#或vb.net中,计算一个字符串中查找另一个字符串中出现的次数,他说在网上打了好多方法,我看了一下,有的是用replace的方法去实现,这种方法不是太好,占资源太大了.其实 ...

  7. C#正则表达式编程(二):Regex类用法

    上一篇讲述了在C#中有关正则表达式的类之间的关系,以及它们的方法,这一篇主要是将Regex这个类的用法的,关于Match及MatchCollection类会在下一篇讲到.对于正则表达式的应用,基本上可 ...

  8. C#正则表达式Regex常用匹配

    使用Regex类需要引用命名空间:using System.Text.RegularExpressions; 利用Regex类实现验证 示例1:注释的代码所起的作用是相同的,不过一个是静态方法,一个是 ...

  9. 关于C#正则表达式MatchCollection类的总结,正则表达式的应用

    认识MatchCollection 类 表示通过以迭代方式将正则表达式模式应用于输入字符串所找到的成功匹配的集合. 命名空间:  System.Text.RegularExpressions 属性:C ...

随机推荐

  1. SYNONYMS

    SQL> SELECT * FROM V$VERSION WHERE ROWNUM=1; BANNER --------------------------------------------- ...

  2. Bootstrap-下拉框 Combobox

    Bootstrap下拉框 Combobox显示效果如下: 源代码: <select class="combobox"> <option></optio ...

  3. systemtap 列出所有linux 内核模块与相关函数0

    diskiohttp://blog.163.com/digoal%40126/blog/static/16387704020131015105532435/ [root@localhost linux ...

  4. java class 文件解析

    参考下面两个文章对一个class文件进行解析: http://docs.oracle.com/javase/specs/jvms/se7/html/jvms-4.html#jvms-4.4.6 htt ...

  5. IT牛人博客

    IT牛人博客,参见:http://blog.csdn.net/freebird_lb/article/details/8210276 团队技术博客 淘宝UED淘宝用户体验团队 淘宝核心系统淘宝核心系统 ...

  6. jQuery滑过头像图片展示个人信息效果

    这是一款经典的jQuery图片插件,同时,也可以是一款jQuery提示框插件.这款jQuery插件的功能是当你把鼠标滑过头像图片缩略图时,即可弹出头像对应用户的详细个人信息,弹出的标签虽然不大,但是还 ...

  7. Java 链式编程

    这里来做一个Java 链式编程的例子,基本就是每次返回一个对象本身,这样就能够去调用对象的方法和属性. package com.sun; public class Demo05 { /** * @pa ...

  8. 20151216JqueryUI---dialog代码备份

    $(function () { $('#search_button').button(); /*$('#reg').dialog({ focus:function(e,ui){ alert('注册') ...

  9. 那天有个小孩跟我说LINQ(一) 转载

    1  LINQ准备(代码下载) 新建项目 linq_Ch1控制台程序,新建一个Entity文件夹     1.1 对象初始化器     在Entity新建一个类Student,代码如下 using S ...

  10. Extjs事件继承注意事项

    Extjs事件继承总结: 在基类中只需配置通用事件,无需配置通用界面,通用界面无效,通用事件一直有效 基表格控制器