print("a".matches("[^abc]"));//false
print("a".matches("[^[abc]]"));//true why??
Thank you!

解决方案 »

  1.   

    print("a".matches("[^abc]"));//false  //这里的^表示非的意思了.
      

  2.   

    print("a".matches("[^[abc]]"));//true 这里的是把里边的^[abc]当做一个整体了.
      

  3.   

    经过反复测试发现
    print("a".matches("[^[abc]]"));//true 这里的^是起到了开关的作用了print("d".matches("[^[abc]d]"));//false
    print("d".matches("[d^[abc]]"));//true这里的^变成了普通的^字符了.print("^".matches("[d^[abc]]"));//true
      

  4.   

    print("a".matches("[^[abc]]"));//true 
    符合非B,非C的情况,哈哈~
      

  5.   

    print("a".matches("[^abc]"));//false 表示 任何字符,但除了 a,b,c 所以是false;print("a".matches("[^[abc]]"));//true 表示开头是 a或b或c, 所以是true;不对的地方望指正。
      

  6.   

    "a".matches("[^abc]"); 表示的是任意一个字符除了a或者b或者c "a".matches("[^[abc]]");//true 
    第二个我是这么理解的:
    它表示行起始符^和abc的并集,也就是^或者a或者b或者c.
    但是[]在jdk文档里描述为字符类匹配,只有行起始符的字符是不存在的,所以满足条件的只有a或者b或者c.
    "d".matches("[d[abc]]")就可以满足为true了,代表一个字符,它为d或者a或者b或者c喵~`
      

  7.   

    12楼描述有点问题:
    "它表示行起始符^和abc的并集,也就是^或者a或者b或者c. "
    应该是
    "它表示行起始符^和abc的并集,也就是行起始符或者a或者b或者c. "
    喵~`
      

  8.   


    按照你说的
    下面的应该是true ?
    System.out.println("^a".matches("[^[abc]]"));
    System.out.println("^".matches("[^[abc]]"));
    但我刚实验了下,都是false啊。
      

  9.   

    一个简单的试验: 
    [^]  的效果是 包括在里面的东西都会自动转义 所以 System.out.println("^".matches("[^[abc]]"));   里面的  一对[] 没有特殊含义, 相当与外面的 \[  \]测试一下  System.out.println("[".matches("[^[abc]]"));   // false

                    // 把 里面的 [] 都去掉 
    System.out.println("[".matches("[^abc]"));    // true貌似比较明显了  :  [^] 里面的 [] 被当成了简单的 字符
    楼主的列子  误导了大家 
    对于  [^[abc]]  其实机器的理解是   [^[abc]  + ]  匹配第一个字母不是 [ a b c 第二个字母是 ] 的字串
    试验如下
    print("a".matches("[^abc]"));//false
    print("a".matches("[^[abc]]"));//true 
    System.out.println("a]".matches("[^[abc]]"));//false
      

  10.   


    所以 System.out.println("^".matches("[^[abc]]"));  里面的  一对[] 没有特殊含义, 相当与外面的 \[  \] 上面的回答 这一部分有误,  匹配 [ 时需要转义 \[    而匹配 ] 时不用;System.out.println("]".matches("]"));//true System.out.println("[".matches("\\["));//true 
    System.out.println("[".matches("["));// 运行时报错!~
      

  11.   

    有 试验了几次;  
    有点怀疑  java 中 
    print("a".matches("[^[abc]]"));//true    
    这个实现是有误的了。。  
    在 js 中, 该匹配是失败的http://www.regextester.com/index.html
      

  12.   


    结果一样的啊 System.out.println("\\^a".matches("[^[abc]]"));//false
    System.out.println("\\^".matches("[^[abc]]"));//false
    另:正则表达式确实没看过。
      

  13.   

    12楼的理解是正确的;  正则表达式  "[^[abc]]"   正确的拆分应该是  最外面的 []   和里面部分  ^[abc] 
    故 [^[abc]] 匹配一个非a\b\c 的字符
      

  14.   

    感觉十楼的不对。[^[abc]]如果理解成是以a或b或c开头的话,那[$[abc]]怎么理解?
    "a".matches("[$[abc]]") 同样是true 难道理解成$ 后面跟着a或b或c?十八楼的也不对。
    [ ] 被包括在 [ ]里面并没有成为普通字符。
    试试"[".matches("[[]");吧。
    会有错的。
      

  15.   

    print("a".matches("[^abc]"));//false 
    print("a".matches("[^[abc]]"));//true //表示一行的开头,是abc中的任意一个
      

  16.   


    我的理解正是如此。"[$[abc]]" 表示结尾是 a或b或c。下面这个是true:System.out.println("casdfsa".matches(".*[$[abc]]"));//true 
      

  17.   


    $ 代表一行的结束,一行都结束了,怎么可能后面还跟着a或者b或者c??要表示结尾是a或者b或者c应该是这样才对的啊:[abc]$
      

  18.   

    "[$[abc]]"   的理解应该是 匹配 $(转义后的$字符) 或 [abc]
    而 [abc] 又匹配 a b c
    所以 "[$[abc]]"  匹配 $(相当与外面的 \$) a b c测试如下:
    System.out.println("d$".matches("d[$[abc]]"));//true // 注 字符串"d$"中的 $ 仅表示$字符, 而非行尾; 有些同学搞混了 
    System.out.println("da".matches("d[$[abc]]"));//true 
    另外 对于[] 里面特殊字符转义的问题:  大部分特殊字符如 . () $ + 等在 []内是自动转义的;
    而如 ^是否自动转义跟它的位置有关;  测试如下:
    // 测试 . 的自动转义
    System.out.println("t".matches(".")); //true
    System.out.println("t".matches("[.]"));//false
    System.out.println(".".matches("[.]"));//true
    // 测试 ^ 的转义
    System.out.println("^".matches("[^[abc]]")); //false 未转义 表示行首
    System.out.println("^".matches("[[abc^]]")); //true  转义为 ^字符System.out.println("^".matches("[[^abc]]")); //true  未转义 表示非  匹配非abc 的字符
    System.out.println("a".matches("[[^abc]]")); // false 
    System.out.println("d".matches("[[^abc]]")); // true 
      

  19.   

    还有 [] 中 [ 是打死也不转义;  这个写漏了System.out.println("[".matches("[[]")); // 运行时报错
    System.out.println("[".matches("[\\[]")); // true  手动转义 
      

  20.   

    print("a".matches("[^abc]"));//false 
    print("a".matches("[^[abc]]"));//truematches后面放的应该是个正则吧?
    在正则里面^表示开始的意思吧那么第一行matches后面括号里面的意思是一个有3个字母的,不是A,B,C的一个字符
    第二行的应该代表 开始 必须以(a,b,c)中一个字母为开头的字符串
      

  21.   

    print("a".matches("[^abc]"));//false    
    print("a".matches("[^[abc]]"));//true 第一个的意思是 a是不是不是abc中的一个  false
    第二个的意思是 a是不是以abc中的一个字母开头 所以是true
      

  22.   

    查了JDK "^" 是边界匹配符,表示行的开始
      

  23.   

    print("a".matches("[^[abc]]"));//true 这里的是把里边的^[abc]当做一个整体了. 
    ("[^[abc]]")表示是以最前面的字母开头的意思,要是以("[[^abc]]")这种形式出现的话,就表示除去a b c以外的字母.
      

  24.   

    发现有很多人信口开河 根本不经过实验就乱说
    第二个随便实验一下就知道 根本不是以abc中的一个开头的意思 是只能包含其中一个
      

  25.   

    看看源码就知道怎么回事了  // Pattern.java中的
      private CharProperty clazz(boolean consume) {
        CharProperty prev = null;
        CharProperty node = null;
        BitClass bits = new BitClass();
        boolean include = true;
        boolean firstInClass = true;
        int ch = this.next();
        for (;;) {
          switch (ch) {
            case '^':
              // Negates if first char in a class, otherwise literal
              if (firstInClass) {
                if (this.temp[this.cursor - 1] != '[')
                  break;
                ch = this.next();
                include = !include;
                continue;
              } else {
                // ^ not first in class, treat as literal
                break;
              }
            case '[': 
              firstInClass = false;
              node = this.clazz(true);  // 遇到[就递归处理,所以[^[abc]] 相当于[abc]
                                        //  [^a[^abc]],相当于[^a]&[^abc]
              if (prev == null)
                prev = node;
              else
                prev = union(prev, node);
              ch = this.peek();
              continue;
            case '&':
        .....注意里面的 case '[': 处理测试一下:  System.out.println(Pattern.matches("[^abc]", "a"));  // false
      System.out.println(Pattern.matches("[^[abc]]", "a")); // true
      System.out.println(Pattern.matches("[^[^[abc]]]", "a")); //true
      System.out.println(Pattern.matches("[^a[^abc]]", "a")); // false
      System.out.println(Pattern.matches("[^a[^abc]]", "b")); // true
      System.out.println(Pattern.matches("[[^a]&[^abc]]", "a")); // false
      System.out.println(Pattern.matches("[[^a]&[^abc]]", "b")); // true
      

  26.   

    对于[] 就是将abc 看做一个整体来匹配 只有当"abc" 时才会 true
     而你的第一个 "a" "ab" "abc" "abc……" 匹配返回的都是 true
      

  27.   


    print("a".matches("[^abc]"));//false 
    print("a".matches("[^[abc]]"));//true 
    要理解方括号的含义啊
    方括号就是表示多选一,而且只能选择方括号的一个数字
    print("a".matches("[^abc]"));要么不是a,要么是b,再或者是c 只能三种情况啊 显然返回false啊
    print("a".matches("[^[abc]]"));要么不是a,要么不是b,再或者不是c 只能这三种情况 a符合第二种,第三种情形啊 显然返回true啊