C#使用正则表达式提取数据

有时候我们可能需要从一个字符串中提取一些我们想要的数据。这些字符串是有一定存在规则的。

如url地址:

  http://www.cnblogs.com

  http://www.microsoft.com

我们现在需要从中只取出站名。也就是说只需要cnblogs或microsoft。对于这样的需求我们不能使用SubString方法进行简单的截取,应为那样在存在这样的url时可能出问题:http://www.sina.com.cn。

这时我们就需要使用正则表达式进行提取了,代码如下:

 

代码
Regex reg = new Regex(@"(http://)?www\.(\w+)\.((com)|(cn)|(net))(\.cn)?/?");
string source = "http://www.sina.com.cn/";
var result
= reg.Match(source).Groups;
foreach(var item in result)
{
Console.WriteLine(item);
}
Console.ReadKey();

 

 

 输出结果:

 http://www.sina.com.cn/

http://

sina

com

com

(空白) //没有输出

(空白) //没有输出

.cn

现在我们如果想提取需要的部分就只需要取对应的索引就可以了。如取sina 就读result[2]。

提取出的数据为什么被这样拆分呢?

首先,我们知道正则表达式的分组概念,一个括号表示一个分组,从左到右标示。上面的正则表达式存在8个分组。7个括号+整体一个,第一个分组是整体,所以匹配出来时http://www.sina.com.cn/,然后从左到右匹配,第二个分组是(http://)?,它表示http:// 可以出现0或1次,如果被匹配字符串没有输入http://那么这个匹配得到的结果为空,由于我们存在输入,所以匹配结果为http://;第三个分组为(\w+),它表示字符出现至少一次(.不属于字符)匹配结果为sina;接下来的一个分组为((com)|(cn)|(net)),内嵌括号就和剥洋葱一样,先外面,再里面。所以匹配结果为com;接下来是(com),匹配得到com;然后(cn),没有得到匹配输入,所以为空;然后是(net),同样没有,为空;最后是(\.cn)?,表示.cn出现0或1次,匹配得到结果.cn。综上得到这样的结果。

此外,正则表达式的split方法和string的spilt方法具有同样的用法,只不过正则表达分割是按照正则表达式匹配的方式进行分割。

 

 


 

 

 

 

 

 

 

posted @ 2010-09-09 12:02  郭鹏  阅读(27151)  评论(0编辑  收藏  举报