现在有一个字符串“中国china2009"我想把它拆成三个字符串,中国,china,2009用正则表达式
昨天得到的答案是:
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));
        }
    }        
}
但是我现在希望对于"china中国2009”这种情况也可以得到三个字符串,中国,china,2009 正则表达式如何去写呢

解决方案 »

  1.   

    Matcher m=Pattern.compile("([a-zA-Z]*)([\u4e00-\u9fa5]*)(\\d*)").matcher(s); 
      

  2.   

    输出顺序也要换一下
    import java.util.regex.*;
    public class MyRegex2 {
    public static void main(String[] args) {
    String s="china中国2009";
    /*
     * 匹配中文字符的正则表达式: [\u4e00-\u9fa5]
     * [a-zA-Z]*:表示英文字母有0个或多个
     * \\d*:表示数字有0个或多个
     */
    Matcher m=Pattern.compile("([a-zA-Z]*)([\u4e00-\u9fa5]*)(\\d*)").matcher(s);
    if(m.find()){
    //第一对小括号表示第一组,第二对小括号表示第二组...
    System.out.println(m.group(2));
    System.out.println(m.group(1));
    System.out.println(m.group(3));
    }
    }
    }
      

  3.   

    用循环处理所有情况String s="2009china中国"; 
    while(s.length() > 0){
               char c = s.charAt(0);
               Matcher m;
               if (c >= '0' && c <= '9') {
                   m = Pattern.compile("([0-9]*)(.*)").matcher(s);
                   
               } else if ((c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z')) {
                   m = Pattern.compile("([a-zA-Z]*)(.*)").matcher(s);
               } else {
                   m = Pattern.compile("([\u4e00-\u9fa5]*)(.*)").matcher(s);
               }
               
               if (m.find()) {
                       String substr = m.group(1);
                       System.out.println(substr);
                       s = s.substring(substr.length());
              }
           }
      

  4.   

    用正则表达式的话没有办法处理太多复杂的字符串,比如如果是String s="中国china2008中国2009"。
    可以用循环直接处理,根据字符的范围从头到尾解析。
      

  5.   

    只能这样了,期待好的答案
    import java.util.regex.*;
    public class MyRegex2 {
        public static void main(String[] args) {
            String s="china中国2009";    
            String[] arr=new String[3];
            arr[0]="(\\w*)([\u4e00-\u9fa5]*)(\\d*)";
            arr[1]="([\u4e00-\u9fa5]*)([a-zA-Z]*)(\\d*)";
            arr[2]="(\\D*)(\\d*)";
            for (String regex : arr) {
             Matcher m=Pattern.compile(regex).matcher(s);
             if(m.find()){
             System.out.println(m.group(2));
             }
    }
        }        
    }
      

  6.   

    答:参考代码:String reg="(?<=[\u4e00-\u9fa5])(?=[a-zA-Z])|(?<=[a-zA-Z])(?=\\d)|(?<=[a-zA-Z])(?=[\u4e00-\u9fa5])|(?<=[\u4e00-\u9fa5])(?=\\d)";    String[] rs="中国china2009".split(reg);
        String[] rs1="china中国2009".split(reg);
        System.out.println("第一种情况");
        for(String ss:rs)
        {
         System.out.println(ss);
        }
        System.out.println("第二种情况");
        for(String ss:rs1)
        {
         System.out.println(ss);
        }运行结果:
    第一种情况
    中国
    china
    2009
    第二种情况
    china
    中国
    2009
      

  7.   

    现在发现又有一种新的情况比如 中国2009中华china这种情况 要拆成 中国 中华 china 2009 这样,我用循环写了,但是看起来不如正则表达式正规