数据结构 C#描述 第八章 前篇
模式匹配和文本处理-正则表达式
尽管String和StringBuilder类提供了一系列的操作字符串的方法,但是RegEx为字符串的处理提供了更强大的能力。字符串的 很多时候多涉及到串的匹配,而这中操作是用另外一种语言来提供的――正则表达式。本章中,我们将看见怎样用正则表达式以及用他来解决文本处理的问题。
正则表达式介绍
正则表达式是一种描述串中字符匹配的语言,描述了字符的重复的次数,是否可选,以及可以包含哪些字符等等。正则表达式还可以用来在串中截取和查找字符。
其实正则表达式本身也只是一个串,只不过这个串是你定义来查找其他串的串
一个正则表达式包含一些特殊的字符,称之为“通配符”。通配符用来标明重复,可选,或者分组。
很多有经验的计算机用户已经会在他们的工作中用正则表达式,即使他们还没有意识到他们在用。,比如,有时候在命令行输入:
C:">dir myfile.exe
“myfile.exe”就是一个正则表达式。这个表达式被传入dir命令中,之后,任何在C盘中的以myfile.exe的文件都显示出来了。
很多用户也用到下面的命令:
C:">dir *.cs
之后,就会把C盘中的所有的后缀名为.cs的文件都显示出来。
上面的正则表达式就包含了一个通配符。“*.cs“是一个正则表达式,而”*”就是一个通配符,意味这零个或者多个,而余下的“.cs”只普通的文件后缀名。整个正则表达式的意思就是”找出C中的所有以cs结尾的文件“。
当然,还有很多更加强大的正则表达式。现在让我们来看看在C#中的正则表达式。
纵观正则表达式的使用
说到正则表达式,我们将会介绍RegEx类的使用。这个类在 System.Text.RegularExpression名称空间下。
一旦我们将这个类引用到我们的程序中,,我们就要考虑怎样使用类。如果想要执行匹配,我们将会用到Match类。如果想截取字符,那就要用Replace方法。
让我们以一个匹配字符串的例子开始。给了一个字符串“the quick brow fox jumped over the lazy dog“。我们想找出” the“.。代码如下:
using System;
using System.Text.RegularExpressions;
public class Chapter8
{
static void Main()
{
Regex reg = new 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);
}
}
}
首先我们创建了一个Regex独享,并且在构造器中传入我们想要匹配其他串的正则表达式。然后,我们在创建一个字符串str1。也申明一个Match类,matchSet。Match类提供了保存被匹配串str1的方法。
然后在if语句中用到了Match类的Success属性,来说明,如果匹配成功将怎样。
Match类的一个问题就是:它只执行一次匹配。如,在之前的代码中,str1有两个”the“,当是结果返回的是0,即只是执行了一次匹配,返回第一个“the”
的位置。我们可以用另外的一个类Matches,来保存和执行多次匹配。我们将匹配的结果保存在MatchCollection对象中。代码如下:
using System;
using System.Text.RegularExpressions;
public class Chapter8
{
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 match a mactch at: " + aMatch.Index);
}
Console.Read();
}
}
结果输入:
found match a mactch at: 0
found match a mactch at: 32
下面我们将看看怎样用Replace方法来用一个串替换另外的串。Replace方法是一类的方法,即,是一个静态的方法。方法要传入三个参数:目标串(要被替换的那个串),被替换的那些字符,替换的字符。。还是看看代码:
string s = "the quick brown fox jumped over the brown
dog";
s = Regex.Replace(s, "brown", "black");
结果是:“the quick black fox jumped over the black dog”.
关于Regex的用法还有很多。下面将来看看更加复杂的用法。