String c = "([zkgj]|[ddsj]|[cxlb]){4}[_scp_]{5}([zk]|[js]){2}";String a ="zkgj_ssp_zk";System.out.println(a.matches(c));结果是true;把String a ="zkgj_stp_zk";等一些字母时,又是false;搞不清楚啊,大家看看这个是什么问题啊?运行环境java 1.4

解决方案 »

  1.   

    1. 第2个字符串不匹配是因为stp里面多了个t,而正则式中[_scp_]{5}中是不允许有t的.
    2. [zkgj]表示zkgj其中任意一个字符 {4}表示由这4个字符组成的4个字符的串.
    3. 你这里的|没有意义: [zkgj]|[ddsj]和[zkgjdds]没区别.
    4. 你这个正则式写的有问题吧:
       如果要实现zkgj或ddsj或cxlb应该写成(?:(?:zkgj)|(?:ddsj)|(?:cxlb))而不是[zkgj]|[ddsj]|[cxlb]){4}
      

  2.   

    汗,看了下api 完全理解错误了
      

  3.   

    ([zkgj]|[ddsj]|[cxlb]){4}   [_scp_]{5}   ([zk]|[js]){2}
    |-----------1-----------|    |----2---|   |-----3------|这个正则表达式分析下:
    1.( [zkgj] | [ddsj] | [cxlb] )表示:[zkgj] 或 [ddsj] 或 [cxlb]。
       而[zkgj]表示:z、k、g或j;
         [ddsj]表示:d、d、s或j;
         [cxlb]表示:c、x、l或b;
       {4}表示出现的次数恰好是4
    总结下来就是:由z、k、g、j、d、d、s、j、c、x、l、b组成的长度为4的字符串2.[_scp_]表示:_、s、c、p、_;
      {5}表示出现的次数恰好是5
    总结下来就是:由_、s、c、p、_组成的长度为5的字符串3.[zk]表示:z或k
      [js]表示:j或s
      {2}表示出现的次数恰好是2
    总结下来就是:由z、k、j或s组成的长度为2的字符串所以zkgj_ssp_zk符合正则表达式的要求;zkgj_stp_zk 的 _stp_中t是不符合的,所以返回false。
      

  4.   


    我对正则表达式不太清楚。请问 你的:(?:(?:zkgj)|(?:ddsj)|(?:cxlb)) 里面,?:的具体含义是什么呢。查API说是“作为非捕获组”,不太明白,能通俗点帮讲讲吗?
    谢谢!
      

  5.   

    用括号包起来的通常是做为一个捕获组的,可以通过matcher.group(i)获取组内的内容,如果括号里加上?:就表示这个括号内的内容不做为一个捕获组处理. 也就是无法通过matcher.group(i)单独获取括号内的内容.