regex:  [[aa]]
目标串: a[]为什么结果匹配为:[]

解决方案 »

  1.   

    不是所有的语言都支持字符组[]的嵌套的,我所了解的语言中,目前只有。NET支持
    JavaScript中既然不支持,那么对[[aa]]的解释自然就不是“[”、“]”、“a”三个字符中的任意一个了
    此时应该是
    [[aa]]
    也就是第一个“[”和第一个“]”组成字符组,最后一个“]”只是普通字符“]”而已
    此时由前面的字符组“[[aa]”也就相当于“[\[a]”来匹配字符“[”,由最后的“]”来匹配字符“]”
    <script type="text/javascript"> 
    var test = "a[]";
    var reg = /[[aa]]/;
    document.write(test.match(reg));
    </script>
    /*-------输出-------
    []
    */将第二个“]”转义,此时就是一个字符组了
    [[aa\]]
    看一下输出
    <script type="text/javascript"> 
    var test = "a[]";
    var reg = /[[aa\]]/;
    document.write(test.match(reg));
    </script>
    /*-------输出-------
    a
    */这种正则,也仅仅是在学习研究时出现,实际应用中绝不允许出现
    容易得到无法预期的结果,也难以维护
      

  2.   

    学习了。原来如此。.net下我只知道[]中间的[]需要转义,还真没想过嵌套使用。
      

  3.   

    在.NET中,不构成歧义的情况下,“[”和“]”可以不用转义,程序也可以得到预期结果,但是这种写法可读性较差,而且出现错误时不易排查,因此不推荐这种写法    举例:Regex reg = new Regex("[^]]+");  //不推荐     .NET的字符组中支持集合减法,语法[set1-[set2]],例如[a-z-[aeiou]]表示除元音外的小写字母。但是除非你很了解这种语法的支持范围,以及确实有必要这样做,否则不要轻易使用这种可读性较差的语法。事实上完全可以用多个范围区间[b-df-hj-np-tv-z],在区间较多,导致可读性差、容易出错的情况下,可以使用正向预搜索来实现以上需求,(?![aeiou])[a-z],这种语法规则,支持范围要大得多,可读性也要好一些。其实在任何语言中,无论是否支持字符组嵌套或是自动转义处理,都不推荐直接嵌套使用,如确实有必要在字符组中出现“[”和“]”时,一定要做转义处理