zoukankan      html  css  js  c++  java
  • [ ] 字符组(Character Classes) (转)

        []能够匹配所包含的一系列字符中的任意一个。需要注意的是,[]虽然能匹配其中的任意一个字符,但匹配的结果只能是一个字符,不是多个。

        例如[abc]表示字符“a”或“b”或“c”。

        []支持用连字符“-”连接两个字符,来表示一个字符范围。需要注意的是,“-”前后的两个字符是有顺序的,即使用相同的编码时,后面的字符码位应大于或等于前面字符的码位。

        例如[a-z]表示任意一个小写字母。而在程序中使用[z-a]则会报“[x-y] 范围的顺序颠倒”这样的异常。

        大部分在正则中有特殊意义、在匹配其本身时需转义的字符,在[]内是不需要转义的。必须转义的只有“”、“[”和“]”,而“^”出现在[]开始位置,“-”前后构成范围区间时,需要转义,出现在其它位置不需要转义,例如[^.$^{[(|)*+?-\]

        在.NET中,不构成歧义的情况下,“[”和“]”可以不用转义,程序也可以得到预期结果,但是这种写法可读性较差,而且出现错误时不易排查,因此不推荐这种写法

        举例:Regex reg = new Regex("[^]]+");  //不推荐

        .NET的字符组中支持集合减法,语法[set1-[set2]],例如[a-z-[aeiou]]表示除元音外的小写字母。但是除非你很了解这种语法的支持范围,以及确实有必要这样做,否则不要轻易使用这种可读性较差的语法。事实上完全可以用多个范围区间[b-df-hj-np-tv-z],在区间较多,导致可读性差、容易出错的情况下,可以使用正向预搜索来实现以上需求,(?![aeiou])[a-z],这种语法规则,支持范围要大得多,可读性也要好一些。

    常见错误用法:

        因为[]本身表示的就是字符之间“或”的关系,因此在[]中使用“|”来表示“或”的关系是错误的。

    举例:[a|b|c]表示的是“a”或“b”或“c”或“|”中的任意一个字符。

    举例

           源字符串:ab|ac

           正则表达式:[a|b|c]+

           匹配结果:ab|ac

    [^ ] 排除型字符组

        [^ ]表示匹配任意一个未列举的字符,同样的,匹配的结果也只能是一个字符。

        例如[^abc]表示除字符“a”、“b”、“c”外的任意一个字符。

        [^ ]也支持字符分组,例如[^0-9]表示除数字外的任意一个字符。

        新手最容易犯的错误就是,用[^abc][^(abc)]这样的表达式来匹配不包含“abc”子字符串的字符串。    

    举例

           源字符串:string yourStr = "<aaa>bbb<abc>ccc<ddd>";

           规则描述:取出yourStr中格式为<...>,但<>中不是abc的内容

           预期结果:<aaa><ddd>

           错误写法:<[^abc]*>

           正确写法:<(?!abc>)[^>]*>

         

    还有一点并不常见,在字符组外表示单词边界,但是在字符组内[]表示退格符。

  • 相关阅读:
    针对Python基本数据类型的操作
    Could not transfer artifact org.apache.maven.plugins:maven-clean-plugin:pom:2.5 from 这类问题的解决方法
    校招有感:计算机专业毕业生如何找工作(Java方向)
    我用了半年的时间,把python学到了能出书的程度
    Java面试官经验谈:如何甄别候选人真实的能力,候选人如何展示值钱技能
    Java字节码与反射机制
    以我的亲身经历,聊聊学python的流程,同时推荐学python的书
    面试时通过volatile关键字,全面展示线程内存模型的能力
    如果很好说出finalize用法,面试官会认为你很资深
    C# post json和接收json
  • 原文地址:https://www.cnblogs.com/hubing/p/3154671.html
Copyright © 2011-2022 走看看