zoukankan      html  css  js  c++  java
  • 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方法具有同样的用法,只不过正则表达分割是按照正则表达式匹配的方式进行分割。


  • 相关阅读:
    linux下ls出现文件的后缀有@,* ,/之类的解释
    对shell中cat 和EOF的理解
    linux中test的意义 又可以表示为[]
    Python程序中的进程操作-进程同步(multiprocess.Lock)
    Python程序中的进程操作-开启多进程
    进程的创建和结束
    同步异步阻塞非阻塞
    进程的并行和并发
    进程的调度
    进程基础
  • 原文地址:https://www.cnblogs.com/GuoPeng/p/1822176.html
Copyright © 2011-2022 走看看