`
webdev2014
  • 浏览: 679773 次
文章分类
社区版块
存档分类
最新评论

C#正则表达式Regex类使用

 
阅读更多

作为文本处理的利器——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类的用法

    C# 正则表达式 Regex的用法 编程语法

    C#正则表达式的使用

    C#正则表达式的使用,希望大家可以学习学习! [C#] bool IsValidEmail(string strIn) { // Return true if strIn is in valid e-mail format. return Regex.IsMatch(strIn, @"^([\w-\.]+)@((\[[0-9]{1,3}\.[0-9]{1,3...

    C#字符串和正则表达式参考手册.pdf

    在计算机科学中,是指一个用来描述或者匹配一系列符合某个句法规则的字符串的单个字符串。在很多文本编辑器或其他工具里,...正则表达式通常缩写成“regex”,单数有regexp、regex,复数有regexps、regexes、regexen。

    详解C#正则表达式Regex常用匹配

    主要介绍了C#正则表达式Regex常用匹配,利用Regex类实现验证,感兴趣的小伙伴们可以参考一下

    C#正则表达式使用心得

    正则表达式是用来检验和操作字符串的强大工具。简单的理解正则表达式可以认为是一种特殊的验证字符串。正则表达式常见运用是验证...当然正则表达式不仅仅是用于验证,可以说只要运用字符串的地方都可以使用正则表达式

    C#_Regex_深入正则表达式.doc

    C#_Regex_深入正则表达式.doc

    C#正则表达式Regex类用法实例分析

    本文实例讲述了C#正则表达式Regex类用法,分享给大家供大家参考。具体实现方法如下: 一、在C#中,要使用正则表达式类,请在源文件开头处添加以下语句: 代码如下:using System.Text.RegularExpressions; 二、RegEx...

    正则表达式整理汇总(参考学习)

    [1]里面在包括一个正则表达式测试小程序 RegexTester.exe [2]正则表达式30分钟入门教程.pdf] [3]正则表达式规则.doc [4]正则表达式30分钟入门教程.mht 自己整理用的,现在分享一下吧。 当然也是为了赚一些...

    《学习正则表达式》高清扫描版 PDF

    通过匹配特定单词、字符和模式,读者很快就可以自己动手使用正则表达式匹配、提取和转换文本。正则表达式是程序员必备的强大工具,得到了各种Unix实用程序,以及Perl、Java、JavaScript、C#等编程语言的支持。读完...

    c# Regex 正则表达式基类 .net

    Regex c# .net 正则表达式基类,最全面的正则表达式基础类,方便调用,作者肖俊

    18.C#字符串和正则表达式参考手册 影印版

    C#字符串和正则表达式参考手册 目 录 第1章 系统处理文本的方式 1 1.1 .NET Framework 1 1.1.1 公共语言运行时 2 1.1.2 .NET Framework类库 3 1.2 文本是一种数据类型 4 1.2.1 C#的数据类型 5 1.2.2 字符和字符集 6 ...

    C# 正则表达式测试工具

    这是一个非常好用的正则表达式工具,可以在上面测试你想到的正则表达式,而且可以把正则表达式保存下来供下次调用,也可以方便地帮你生成C#代码。另外还附上了一个30分钟快速入门的正则表达式入门教程,希望大家喜欢...

    精通正则表达式 中英文

    如今,正则表达式已经成为众多语言及工具——Perl、PHP、Java、Python、Ruby、MysQL、VB.NET和c#(以及.NET Framework中的任何语言)——中的标准特性,依靠它,你能以之前完全不敢设想的方式进行复杂而精巧的文本...

    C#正则表达式之Regex类用法详解

    Regex 类表示不可变(只读)的正则表达式。它还包含各种静态方法,允许在不显式创建其他类的实例的情况下使用其他正则表达式类。 正则表达式基础概述 什么是正则表达式  在编写字符串的处理程序时,经常会有查找...

    C#正则表达式Regex类的常用匹配

    本文通过几个具体的实例,给大家详细介绍了C#中的正则表达式Regex类的实用方法,非常的细致,有需要的小伙伴可以参考下

    C# 最全的日期正则表达式,没有之一

    考虑到这个正则表达式仅仅是用作验证,所以捕获组没有意义,只会占用资源,影响匹配效率,所以可以使用非捕获组来进行优化。 ^(?:(?!0000)[0-9]{4}-(?:(?:0[1-9]|1[0-2])-(?:0[1-9]|1[0-9]|2[0-8])|(?:0[13-9]|1[0-2...

    (C#)正则表达式快速验证工具

    David Veeneman写的一个C#版正则表达式验证小工具,很实用,将源代码改了一下,供大家下载学习。 博客:wknight.cnblogs.com

    精通正则表达式(第三版)

    随着互联网的迅速发展,几乎所有工具软件和程序语言都支持的正则表达式也变得越来越强大和易于使用。《精通正则表达式(第3版)》是讲解正则表达式的经典之作。《精通正则表达式(第3版)》主要讲解了正则表达式的特性和...

    RegexDesigner.net 正则表达式工具,含有源代码,C#的.

    regexdesigner.net是一个强力的可视化工具,可以帮助我们构建与测试.NET正则表达式,RegexDesigner.NET让我们将我们开发出的正则表达式集成到我们的应用程序,可以方便的生成C#或VB.NET代码并编译成程序集

Global site tag (gtag.js) - Google Analytics