• 【.NET】正则表达式笔记


    很早就听说正则表达式的强大,今天终于一睹它的真容,在这里记下学习时候的笔记,以便以后查看

    1、正则表达式

      用于描述字符串规则的的特殊的字符(正则表达式本身是字符串,用来描述字符串的相关规则,用于与其他字符串进行匹配)

      例如:

        正则表达式:Http  表示单词 Http,两边的表示单词的开始于结束

          可以与"Here is a Http tag"匹配,但是不能与'", "HttpRequest", "XMLHttpRequest"等字符串匹配,

    2、元字符(meta character)

      用于描述最基本的信息,常见的有以下元字符

          单词的开始于结束

        w  字母(大小写),数字,下划线

        s  任意空字符(空格,制表符,回车)

        d  匹配数字0-9

        .   小数点,匹配非换行字符

        ^  字符串的开始(注意:是表示单词

        $  字符串的结束

        其中:B,W,S,D的含义与小写的相反

          例如:D表示非数字字符

    3、转义字符

      小数点:  .  

      星号:   *  

      下划线:  \  

      括号:   (  )

    3、限定字符      

      *    重复0次或多次
      +    重复1次或多次
      ?    重复0次或1次
      {n}   重复n次
      {n,}  重复n次以上
      {n,m}   重复n次到m次,包括n,m次

      当要匹配多个字符的时候,可以使用限定字符

          例如:^d{5}w*$  表示以5个数字开头的后面跟任意长度的字符(字母或数字或下划线)

    4、字符类

      匹配单个字符  [abc]      匹配所有a,b,c字符

              [^acd]      匹配所有的部位a,c,d的字符

              [,.?!;'"]       匹配半角标点

              [a-zA-Z0-9_]  相当于w

    5、分枝条件

      当有多个匹配条件的时候,可以使用  '|'  符号来连接几个条件,会优先匹配第一个

      例如:d{5}-d{4}|d{4}-d{5}  

       IP地址:  ((2[0-4]d|25[0-5]|[01]?dd?).){3}(2[0-4]d|25[0-5]|[01]?dd?)

    6、分组

      后向引用:用于搜索前面匹配的结果

      例如:在后面的匹配需要用到前面的匹配结果,

        (?<name>w+)s+k<name>    匹配两个连续相同的单词

      (exp)        匹配exp表达式,并将匹配文本放到自动命名组里

      (?<name>exp)   可对匹配的文本手动命名,并通过k<name>引用,也可以吧尖括号换成单引号(?'name'exp)

      (?:exp)       不获取文本,不分配组号

    7、断言

      1)正预测先行断言  (?=exp)  先匹配断言里面的表达式,匹配出之前的位置,再匹配外面的表达式,匹配结果不包含断言内容

        例如:d[0-9]*(?=9)  先判断单词是否以9结束,在判断是否为全数字,匹配结果不包含9

          78159  匹配结果为  7815  断言位置在9之前

      2)正回顾后发断言  (?<=exp)  匹配出之后的位置

        例如:(?<=re)w*  匹配以 re 开头的单词,不包括re

          I'm reading  匹配结果为  eading  断言位置在re之后

      3)负向零宽先行断言   (?!exp) 

        与正预测先行断言相似,只是匹配的条件为相反

        例如:  d{3}(?!d)      匹配三位数字,而且这三位数字的后面不能是数字

             ((?!abc)w)+    匹配不包含连续字符串abc的单词    

       4)负向零宽后发断言  (?<!exp) 

        与郑回顾后发断言相似,匹配条件相反

        例如:  (?<![a-z])d{7}    匹配前面不是小写字母的七位数字

    8、注释

      (?#comment)  例如  d{3}(?!d)(?#这里是注释)

    9、贪婪匹配与懒惰匹配

      在默认情况下,所有的匹配都会采取贪婪匹配,即匹配竟可能多的项

      例如:  a.*b  匹配  abaaababaa

        默认情况下回匹配出  abaaabab,  而不是 ab,aaab,ab

      在限定符后面加上?则可以竟可能少的匹配

          a.*?  匹配  abaaababaa  结果为 ab,aaab,ab

    10、在.NET中使用

            Regex regex = new Regex(@"^w+([-+.]w+)*@w+([-.]w+)*.w+([-.]w+)*$", RegexOptions.Multiline | RegexOptions.IgnorePatternWhitespace);
            bool b = regex.IsMatch("44917929@qq.com");

      在new Regex的时候,可以设置一些参数  http://msdn.microsoft.com/zh-cn/library/system.text.regularexpressions.regexoptions.aspx

        Compiled              指定将正则表达式编译为程序集。 这会产生更快的执行速度,但会增加启动时间。 
        ExplicitCapture           仅捕获显式命名的组
        IgnoreCase            指定不区分大小写的匹配。
        None               匹配任何字符除了 。^和$不起作用。
        Singleline             匹配任何字符。^和$匹配整个字符串
        Multiline             匹配任何字符除了 。^和$匹配每行的开头和结尾。
        IgnorePatternWhitespace    忽略表达式中的非转义空白,并启用#标记注释

    11、练习

        1、非负整数      ^d+$
        2、正整数       ^[1-9]*[1-9][0-9]*$
        3、非正整数      ^(-d+10)$
        4、负整数       ^-[1-9]*[1-9][0-9]*$
        5、整数        ^-?d+$
        5、非负浮点数     ^d+(.d+)?$
        6、正浮点数

        7、长度为8-10的用户名(以字母或下划线开头)          ^[A-Za-z_]w{7,9}$
        8、电子邮件                          ^w+([-+.]w+)*@w+([-.]w+)*.w+([-.]w+)*$

        9、一个没有属性的html标签的内容(例如<div>内容</div>)   (?<=<(w+)>).*(?=</1>)

    参考文章:

    http://www.cnblogs.com/deerchao/archive/2006/08/24/zhengzhe30fengzhongjiaocheng.html#lookaround

  • 相关阅读:
    重新看待Jar包冲突问题及解决方案
    一步步完成Maven+SpringMVC+SpringFox+Swagger整合示例
    [ACM] POJ 1611 The Suspects (并查集,输出第i个人所在集合的总人数)
    James Whittaker的软件測试戒律(二)
    <html>
    andorid ndk 各种坑啊 记录下
    Android的ProgressBar进度条-android学习之旅(三十一)
    Android Jsoup 爬取网页数据
    iOS笔记UI--使用storyboard加入约束
    使用appledoc 生成技术API文档具体解释
  • 原文地址:https://www.cnblogs.com/bomo/p/3220425.html
Copyright © 2020-2023  润新知