有时候我们可能需要从一个字符串中提取一些我们想要的数据。这些字符串是有一定存在规则的。
如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://
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方法具有同样的用法,只不过正则表达分割是按照正则表达式匹配的方式进行分割。