解决方案 »

  1.   

    import java.util.*;
    class reg
    {
    public static void main(String args[]){
    String s="品名哈哈别名英文名gaga";
    s=s.replaceAll("品名(.*)别名(.*)英文名(.*)","$1,$2,$3");//用","分割得到的各个名称
    System.out.println(s);
    String ss[]=s.split(",");//再用","切割一下就可以了
    for(String str:ss){
    System.out.println(str);
    }

    }
    }
      

  2.   

    (品名.*)(别名.*)(英文名.*)
    这样写的话意思就是必须有三个输出项,
    但是看你后面的描述
    有的时候会出现 “品名硝铵英文名Ammonium nitrate” 这种情况, 也就是说并不是所有的字符串都严格的按照你的正则格式构成
    所以就需要用 或  来处理。修改成这样你再试一下 
    (1)((品名.*)(别名.*)(英文名.*))|((品名.*)(英文名.*))   用“或”来处理
    (2)(品名.*)(别名.*){0,1}(英文名.*)     用花括号表示个数  {0 , 1} 表示 0个 或者 1 个,即 :(别名.*)出现一次或者不出现
    快两年多没写过正则了   不知道上面的对不对  你在正则工具里面验证一下 在修改一下就行
     
      

  3.   

      String s="品名硝铵别名硝酸铵英文名Ammonium nitrate";
           Matcher matcher= Pattern.compile("(品名(.*?)|别名(.*?))(?=别|英)|英文名(.*)").matcher(s);
           while( matcher.find()){
            System.out.println(matcher.group().replaceAll("品名|别名|英文名", ""));
           }
      

  4.   

    import java.util.*;
    class reg
    {
    public static void main(String args[]){
    //String s="品名哈哈别名呵呵英文名gaga";
    String s="品名哈哈英文名gaga";
    s=s.replaceAll("品名|别名|英文名",",");//用","分割得到的各个名称
    System.out.println(s);
    String ss[]=s.split(",");//再用","切割一下就可以了
    for(String str:ss){
    System.out.println(str);
    }

    }
    }
      

  5.   

    System.out.println("品名硝铵别名硝酸铵英文名Ammonium nitrate".replaceAll("品名(.*?)(别名(.*?))?英文名(.*?)", "$1,$3,$4"));
    System.out.println("品名硝铵英文名Ammonium nitrate".replaceAll("品名(.*?)(别名(.*?))?英文名(.*?)", "$1,$3,$4"));
    @zhouren1314 的方法更直观哈哈
      

  6.   


    嗯,确实可行,但是如果串中有更多相关属性的话式子(品名xx别名xx英文名xx熔点xx沸点xx...)就会变得更复杂(不过这点我也没提到,不能怪仁兄)
    相比较而言,还是5l兄的更适用