`
nlx0201
  • 浏览: 29025 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
文章分类
社区版块
存档分类
最新评论

C#数据结构和算法学习系列十----正则表达式

 
阅读更多

所谓正则表达式是一种用于描述字符串中字符格式的语言,它提供了对应于重复字符、替换符符以及分组字符的描述符。正则表达式既可以用来执行字符串的搜索,也可以用于字符串的替换。正则表达式本身就是一个定义了用于其他字符串搜索模式的字符串。通常情况下,正则表达式中的字符与其自身匹配,因此正则表达式“the”可以与字符串中任意位置找到的同样字符序列相匹配。正则表达式还可以包含称之为元字符的特殊字符。元字符用于表示重复、替换或者分组。

1.正则表达式使用。为了使用正则表达式, 需要把RegEx 类引入程序。大家可以在System.Text.RegularExpression 名字域中找到这种类。一旦把这种类导入了程序,就需要决定想要用RegEx 类来做什么事情了。如果想要进行匹配,就需要使用Match 类。如果打算做替换,则不需要Match 类了。取而代之的是要用到RegEx 类的Replace 方法。
首先来看看如何在字符串中进行单词匹配操作吧。假设给定一个样例字符串“the quick brown fox jumped over the lazy dog”,这里想要在字符串中找到单词“the”。如下:

using System;
using System.Text.RegularExpressions;
class chapter10
{
    static void Main()
    {
        Regex reg = nNew Regex(" the");
        string str1 = "the quick brown fox jumped over the lazy dog";
        Match matchSet;
        int matchPos;
        matchSet = reg.Match(str1);
        if (matchSet.Success)
        {
            matchPos = matchSet.Index;
            Console.WriteLine("found match at position:" + matchPos);
        }
    }
}
if 语句使用了一种Match 类的属性Success 来确定是否是成功匹配。如果值返回为True,那么正则表达式在字符串中至少匹配了一条子串。否则的话,存储在Success 中的值就是False。程序还可以有另外一种方法来查看是否匹配成功。通过把正则表达式和目标字符串传递给IsMatch 方法的方式可以对正则表达式进行预测试。如果与正则表达式产生了匹配,那么这种方法就返回True,否则返回False。如下:
if (Regex.IsMatch(str1, "the"))
{
    Match aMatch;
    aMatch = reg.Match(str1);
}
用Match 类的一个问题就是它只能存储一个匹配。在前面的实例中,针对子串“the”存在两个匹配。这里可以使用另外一种类Matches 类来存储与正则表达式的多个匹配。为了处理所有找到的匹配可以把匹配存储到MatchCollection 对象中。如下:
using System;
using System.Text.RegularExpressions;
class chapter10
{
    static void Main()
    {
        Regex reg = new Regex(" the");
        string str1 = "the quick brown fox jumped over the lazy dog";
        MatchCollection matchSet;
        matchSet = reg.Matches(str1);
        if (matchSet.Count > 0)
            foreach (Match aMatch in matchSet)
                Console.WriteLine("found a match at: " + aMatch.Index);
        Console.Read();
    }
}

接下来要讨论如何用Replace 方法把一个字符串用另一个字符串来替换。Replace 方法可以作为一种带有三个参数的类方法来进行调用:一个目标字符串,要替换的子串,以及用作替换的子串。如下:

string s = "the quick brown fox jumped over the brown dog";
s = Regex.Replace(s, "brown", "black");

2.数量词的用法 。在编写正则表达式的时候,经常会要想正则表达式添加数量型数据,诸如“精确匹配两次”或者“匹配一次或多次”。利用数量词就可以把这些数据填加到正则表达式里面了。

(1).+这个数量词说明正则表达式应该匹配一个或多个紧接的字符。

(2).*这个数量词说明正则表达式应该匹配零个或多个紧接的字符。

(3).?这个数量词说明正则表达式应该匹配零次或一次的数量词。

(4).{n}这个数量词说明正则表达式应该匹配一个有限数量,n是要找到的匹配数量。

(5).{n,m这个数量词说明正则表达式应该匹配的最大值和最小值,n 表示匹配的最小值而m 则表示最大值。

简单实例如下:

using System;
using System.Text.RegularExpressions;
class chapter10
{
    static void Main()
    {
        string[] words = new string[] {" bad", "boy", "baad","baaad", "bear", "bend"};
        foreach (string word in words)
            if (Regex.IsMatch(word, "ba{2} d"))
                Console.WriteLine(word);
    }
}

3.字符类的使用。字符类可以用多组字符构成。如果想要既匹配小写字母也匹配大写字母,那么可以把正则表达式写成这样:“[A-Za-z]”。当然,如果需要包括全部十个数字,也可以编写像[0-9]这样由数字组成的字符类。此外,通过在字符类前面放置一个脱字符号(^)的方法人们还可以创建字符类的反或者字符类的否定。例如,如果有字符类[aeiou]来表示元音类,那么就可以编写[^aeiou]来表示辅音或非元音。如果把这三个字符类合并,就可以形成正则表达式用法中所谓的单词。正则表达式就像这个样子:[A-Za-z0-9]。这里还有一个可以用来表示同样类的较短小的字符类:\w。\W 用来表示\w 的反,也或者用来表示非单词字符(比如标点符号)。此外,还可以把数字字符类([0-9])写成\d(注意由于在C#语言中反斜杆后跟着其他字符很可能是转义序列,所以诸如\d 这样的代码在C#语言中都以\\d 形式来说明正则表达式而非转义代码)。而非数字字符类([^0-9])则可以写成\D 这样。最后,因为空格符在文本处理中扮演着非常重要的角色,所以把\s 用来表示空格字符,而把\S 用来表示非空格字符。

总结:正则表达式在大多数情况下可以快速的实现查找和替换,不过要对他们的运用做到很熟悉的话,主要是一个日积月累的过程,用得多了,自然就得心应手了。

分享到:
评论

相关推荐

    C#全能速查宝典

    1.1.10 泛型——处理算法和数据结构 11 1.1.11 分部类——将一个类分成几部分 12 1.1.12 is操作符——检查变量是否为指定的类型 14 1.1.13 lock关键字——锁定 15 1.1.14 namespace关键字——定义命名空间 15 1.1.15...

    asp.net知识库

    常用的匹配正则表达式和实例 经典正则表达式 delegate vs. event 我是谁?[C#] 表达式计算引擎 正式发布表达式计算引擎WfcExp V0.9(附源码) 运算表达式类的原理及其实现 #实现的18位身份证格式验证算法 身份证15To18...

    C#开发典型模块大全

    8.2.6 使用正则表达式验证邮件格式 190 8.3 设计过程 191 8.3.1 数据库设计 191 8.3.2 系统登录 191 8.3.3 邮件发送实现 192 8.3.4 为邮件上传多个附件 193 8.3.5 邮件接收实现 194 8.3.6 查看邮件...

    C#开发典型模块大全(光盘)第二部分

    8.2.6 使用正则表达式验证邮件格式 8.3 设计过程 8.3.1 数据库设计 8.3.2 系统登录 8.3.3 邮件发送实现 8.3.4 为邮件上传多个附件 8.3.5 邮件接收实现 8.3.6 查看邮件详细信息 8.3.7 下载附件的实现 8.3.8 删除邮件...

    学习编程的重要免费网站

    我记得在2009年,CSDN评论程序员必备的极大技术,和算法、数据结构并列的,就有正则表达式,而这本书是其中的经典,把很多常见的应用都列出来了,用的时候只要复制粘贴即可。不过作为高手,更应该了解其中的原理,...

    C#开发典型模块大全(光盘)第一部分

    8.2.6 使用正则表达式验证邮件格式 8.3 设计过程 8.3.1 数据库设计 8.3.2 系统登录 8.3.3 邮件发送实现 8.3.4 为邮件上传多个附件 8.3.5 邮件接收实现 8.3.6 查看邮件详细信息 8.3.7 下载附件的实现 8.3.8 删除邮件...

    C#开发典型模块大全(光盘)

    8.2.6 使用正则表达式验证邮件格式 8.3 设计过程 8.3.1 数据库设计 8.3.2 系统登录 8.3.3 邮件发送实现 8.3.4 为邮件上传多个附件 8.3.5 邮件接收实现 8.3.6 查看邮件详细信息 8.3.7 下载附件的实现 8.3.8 删除邮件...

    精通qt4编程(源代码)

    \13.5.1 基本的正则表达式 342 \13.5.2 文字捕获 344 \13.6 小结 345 \高 级 篇 \第14章 XML 348 \14.1 DOM 348 \14.1.1 DOM入门 348 \14.1.2 使用DOM 348 \14.1.3 使用DOM写XML文件 352 \14.2 SAX 354 \14.3 基于流...

    精通Qt4编程(第二版)源代码

    \13.5.1 基本的正则表达式 342 \13.5.2 文字捕获 344 \13.6 小结 345 \高 级 篇 \第14章 XML 348 \14.1 DOM 348 \14.1.1 DOM入门 348 \14.1.2 使用DOM 348 \14.1.3 使用DOM写XML文件 352 \14.2 SAX 354 \...

    史上最好传智播客就业班.net培训教程60G 不下会后悔

    常用数据结构(List、Dictionary、Array)、多态、常用设计模式、反射、常用.net类库、泛型、IO流、委托事件、正则表达式、XML、反射、GC等。 2、数据库开发及ADO.Net(6天) 核心技术课程 数据库开发基础、...

Global site tag (gtag.js) - Google Analytics