C#正则表达式入门及在爬虫中的应用一

如果还不知道什么是正则表达式建议看看这篇文章-30分钟入门正则表达式,讲的很详细 http://deerchao.net/tutorials/regex/regex.htm

本文假设你已经有了一些正则表达式的基础,如果你能跟着做下来相信你对C#中正则的使用也就基本会用了,更多需要的是实践和自己的灵活运用

.NET中的正则表达式位于System.Text.RegularExpressions命名空间中

用到比较多的是这几个类 Regex Match MacthCollection Group GroupCollection

以下用一个实例演示通过这几个类相互间的交互在.NET中应用正则表达式....

设置操作字符串string str = "994677767-XXX";

首先创建一个Regex对象

Regex regex=new Regex(@"(\d{5,9})-(\w+)");

用Regex对象的Match方法去匹配一个字符串,用Value属性得到匹配的值

Console.WriteLine(regex.Match(str).Value); //输出994677767-XXX

这里Match方法提供了3种重载

regex.Match(strString),

regex.Match(strString,offSet)

regex.Match(strString,offSet,maxlength);

strString=要匹配的字符串,offSet=开始匹配的位置(int),maxlength=字符串要匹配的长度

regex.Match(str)返回一个Macth类型的对象

我们可以这样写

Regex regex=new Regex(@"(\d{5,9})-(\w+)");

Match match = regex.Match(str);

Console.WriteLine(match.Value);

Match对象有很多属性和方法,例如.Success返回Bool类型值判断匹配是否成功,.Value返回匹配到的结果,.Length属性,匹配文本的长度...

细心的同学应该也注意到了我们的表达式@"(\d{5,9})-(\w+)"用了俩个()即分组

Match对象可以得到分组捕获的内容

Regex regex=new Regex(@"(\d{5,9})-(\w+)");

Match match = regex.Match(str);

Console.WriteLine(match.Groups[1].Value); //输出994677767

这里用到了Group[1],其实返回的是一个Group对象

我们进一步变形

Regex regex = new Regex(@"(\d{5,9})-(\w+)");

Match match = regex.Match(str);

Group group = match.Groups[1];

Console.WriteLine(group.Value); //输出994677767

Group和Match对象的属性方法差不多这里不在说明

也许有的人会疑问为什么不是XXX

这是因为match.Groups得到的是一个Group对象的集合

集合中的第一个对象match.Groups[0].Value得到的是匹配到的文本内容和match.Value的值是一样的

我们的分组是号是从1开始的,所以match.Groups[1].Value输出994677767

我们输出match.Groups.Count将得到3

到这里相信到家对这几个类的使用有些熟悉了 我们进一步扩展

如果我们的操作字符串类似这样string str = "994677767-XXX 615050000-小Q";

如何取出每一个符合条件的,这里用到了Matches方法返回一个Match对象的集合MatchCollection

string str = "994677767-XXX 615050000-小Q";

Regex regex = new Regex(@"(\d{5,9})-(\w+)");

MatchCollection match = regex.Matches(str);

Console.WriteLine(match.Count);

foreach (Match item in match)

{

Console.WriteLine(item.Value);

}

//结果输出

2

994677767-XXX

615050000-小Q

下面给大家讲一下.NET中Replace的使用

string str = "994677767-XXX 615050000-小Q";

Regex regex = new Regex(@"(\d{5,9})-(\w+)");

regex.Replace提供了6种重载,这里只讲俩种

regex.Replace(strString,replacement); //strString=要被替换的那个字符串,replacement=用来替换的字符串

Regex regex = new Regex(@"(\d{5,9})-(\w+)");

string output = regex.Replace(str, "AAAAAAA");

Console.WriteLine(output); //输出AAAAAAA AAAAAAA

这输出的都是一样的不够灵活

Replace方法并不会修改原始字符串只是返回操作后的字符串

Replace方法允许你传入委托,执行你想要的操作,例如这里应用了一个委托把匹配的每一个中有XXX的替换掉

//首先定义一个静态的处理方法

public static string MatchFun(Match match)

{

  return match.Value.Replace("XXX", "###");

}

//定义一个委托,传入我们创建的处理方法

MatchEvaluator matchEvaluator = new MatchEvaluator(MatchFun);

string str = "994677767-XXX 615050000-小Q";

Regex regex = new Regex(@"(\d{5,9})-(\w+)");

string output = regex.Replace(str, matchEvaluator);//传入创建的委托对象

Console.WriteLine(output); //输出994677767-### 615050000-小Q

Split方法 这里给出一个示例

string str = "994677767-XXX,615050000-小Q、121312-aaa";

Regex regex = new Regex(@"[,、]");

string[] output = regex.Split(str);

for (int i = 0; i < output.Length; i++) { Console.WriteLine(output[i]); }

关于Regex类

Regex的创建可以传入RegexOptions设置选项

例如Regex regex=new Regex(@"\d",RegexOptions.IgnoreCase|RegexOptions.Complied);

RegexOptions.IgnoreCase表示匹配的文本忽略大小写

RegexOptions.Complied表示编译正则表达式,编译后在以后的匹配速度会快些,如果仅用一次那么就没有必要了.

类似的还有RegexOptions.RightToLeft,RegexOptions.Singleline...相信大家都知道是什么意思

多个选项设置用|分开

Regex同时也提供了很多静态的方法,例如

Regex.IsMatch()

查找字符串中是否有数字,有的话返回True

string str = "994677767-XXX";

Console.WriteLine(Regex.IsMatch(str, @"\d")); //输出True

Regex.Matches()

Regex.Replace()

Regex.Split()

在实例中也都存在相应的静态方法,用法基本一样

更多详细内容可以参考原文地址http://blog.csdn.net/MicrosoftCompany/archive/2009/06/06/4248222.aspx