• 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

  • 相关阅读:
    改变form里面input,textarea.select等的默认样式
    serialize() 方法
    纯css实现互动清单
    less学习笔记
    竖直手风琴导航菜单栏
    植树节快到了-那就种棵决策树吧
    简单写个logictic回归
    爬取纽约时报特定关键词新闻并计数
    (数学建模)非线性规划
    (CV学习笔记)看图说话(Image Captioning)-2
  • 原文地址:https://www.cnblogs.com/ygm125/p/2039949.html
Copyright © 2020-2023  润新知