public class Test4 {    public static void main(String[] args) {
        String str = "中国china2009";
        String[] strs = str.split("(?<!^)(?:(?<![a-zA-Z])(?=[a-zA-Z])|(?<![0-9])(?=[0-9])|(?<![\u4e00-\u9faf])(?=[\u4e00-\u9faf]))");
        for(int i = 0; i < strs.length; i++) {
            System.out.println(strs[i]);
        }
    }
}

解决方案 »

  1.   

    结果:中国
    china
    2009
      

  2.   


    (?:X)   X,作为非捕获组
    (?idmsux-idmsux)   Nothing,但是将匹配标志由 on 转为 off
    (?idmsux-idmsux:X)    X,作为带有给定标志 on - off 的非捕获组
    (?=X)  X,通过零宽度的正 lookahead
    (?!X)  X,通过零宽度的负 lookahead
    (?<=X)  X,通过零宽度的正 lookbehind
    (?<!X)  X,通过零宽度的负 lookbehind
    (?>X)  X,作为独立的非捕获组    API也没看明白
      

  3.   


    //这个和上面的结果一样,这个好明白
    import java.util.regex.*;
    public class MyRegex2 {
        public static void main(String[] args) {
            String s="中国china2009";    
            /*
             * 匹配中文字符的正则表达式: [\u4e00-\u9fa5]
             * [a-zA-Z]*:表示英文字母有0个或多个
             * \\d*:表示数字有0个或多个
             */
            Matcher m=Pattern.compile("([\u4e00-\u9fa5]*)([a-zA-Z]*)(\\d*)").matcher(s);
            if(m.find()){
                //第一对小括号表示第一组,第二对小括号表示第二组...
                System.out.println(m.group(1));
                System.out.println(m.group(2));
                System.out.println(m.group(3));
            }
        }        
    }
      

  4.   

    这个:(?:X)      X,作为非捕获组
    (?idmsux-idmsux)      Nothing,但是将匹配标志由 on 转为 off
    (?idmsux-idmsux:X)       X,作为带有给定标志 on - off 的非捕获组
    (?=X)     X,通过零宽度的正 lookahead
    (?!X)     X,通过零宽度的负 lookahead
    (?<=X)     X,通过零宽度的正 lookbehind
    (?<!X)     X,通过零宽度的负 lookbehind
    (?>X)     X,作为独立的非捕获组还不是很懂。。哎。。学无止境!
      

  5.   

    ("(? <!^)  //前面非^
    (?: //匹配后面的表达式,非捕获组(? <![a-zA-Z])(?=[a-zA-Z])|//前面不是字母,后面是字母
    (? <![0-9])(?=[0-9])|//前面不是数字,后面是数字
    (? <![\u4e00-\u9faf])(?=[\u4e00-\u9faf]) //前面不是中文,后面是中文
    )")大约是以上的意思吧,请高手指教
      

  6.   

    捕获组(capturing group)是把多个字符当作一个单元对待的一种方式。通过把字符括在括号内创建捕获组。
    (?:X) X,作为非捕获组 
    匹配 June 和 July 可以写成: 
    Ju(ne|ly)也可以写成 
    Ju(?:ne|ly)前者会把 ( ) 内的在匹配后保留在内存中,而后者不会。与捕获组 ( ) 的意思一样也是将其作为一组进行处理,在匹配完成后在内存中不保留匹配到的字符
    (?=X) 表示当前位置(即字符的缝隙)后面允许出现的字符,比如:表示式 a(?=b),在字符串为 
    ab 时,可能匹配 a,后面的 (?=b) 表示,a 后面的缝隙,可以看作是零宽度。 
    (?!X) 表示当前位置后面不允许出现的字符