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

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

如url地址:

  http://www.cnblogs.com

  http://www.microsoft.com

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

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

 

ContractedBlock.gif ExpandedBlockStart.gif 代码
 
    
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方法具有同样的用法,只不过正则表达分割是按照正则表达式匹配的方式进行分割。

 

 


 

 

 

 

 

 

 

转载于:https://www.cnblogs.com/GuoPeng/archive/2010/09/09/1822176.html

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值