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 用来表示非空格字符。

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值