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

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

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

  1. using System;  
  2. using System.Text.RegularExpressions;  
  3. class chapter10  
  4. {  
  5.     static void Main()  
  6.     {  
  7.         Regex reg = nNew Regex(" the");  
  8.         string str1 = "the quick brown fox jumped over the lazy dog";  
  9.         Match matchSet;  
  10.         int matchPos;  
  11.         matchSet = reg.Match(str1);  
  12.         if (matchSet.Success)  
  13.         {  
  14.             matchPos = matchSet.Index;  
  15.             Console.WriteLine("found match at position:" + matchPos);  
  16.         }  
  17.     }  
  18. }  

if 语句使用了一种Match 类的属性Success 来确定是否是成功匹配。如果值返回为True,那么正则表达式在字符串中至少匹配了一条子串。否则的话,存储在Success 中的值就是False。程序还可以有另外一种方法来查看是否匹配成功。通过把正则表达式和目标字符串传递给IsMatch 方法的方式可以对正则表达式进行预测试。如果与正则表达式产生了匹配,那么这种方法就返回True,否则返回False。如下:

  1. if (Regex.IsMatch(str1, "the"))  
  2. {  
  3.     Match aMatch;  
  4.     aMatch = reg.Match(str1);  
  5. }  

用Match 类的一个问题就是它只能存储一个匹配。在前面的实例中,针对子串“the”存在两个匹配。这里可以使用另外一种类Matches 类来存储与正则表达式的多个匹配。为了处理所有找到的匹配可以把匹配存储到MatchCollection 对象中。如下:

  1. using System;  
  2. using System.Text.RegularExpressions;  
  3. class chapter10  
  4. {  
  5.     static void Main()  
  6.     {  
  7.         Regex reg = new Regex(" the");  
  8.         string str1 = "the quick brown fox jumped over the lazy dog";  
  9.         MatchCollection matchSet;  
  10.         matchSet = reg.Matches(str1);  
  11.         if (matchSet.Count > 0)  
  12.             foreach (Match aMatch in matchSet)  
  13.                 Console.WriteLine("found a match at: " + aMatch.Index);  
  14.         Console.Read();  
  15.     }  
  16. }  

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

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

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

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

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

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

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

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

简单实例如下:

  1. using System;  
  2. using System.Text.RegularExpressions;  
  3. class chapter10  
  4. {  
  5.     static void Main()  
  6.     {  
  7.         string[] words = new string[] {" bad""boy""baad","baaad""bear""bend"};  
  8.         foreach (string word in words)  
  9.             if (Regex.IsMatch(word, "ba{2} d"))  
  10.                 Console.WriteLine(word);  
  11.     }  
  12. }  

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

 

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

posted @ 2011-11-07 16:01  追_bk  阅读(260)  评论(0编辑  收藏  举报