String str="%3D%0I%1S%0F%1J%85C%85C%85CRRR-400ms%6S%0F%0S%Z"
最后需要得到拆分的结果是: 
D:3
I:0
S:1
F:0
J:1
C:85
S:6
F:0
S:0
字符串结束标志:%Z
独立字符串:RRR-400ms其实上面的字符串是一个设备的命令,以D命令为例,命令的格式是 %nD,n表示一个数据大小区间是0-255,但是必须在 % 和 D
之间。
独立字符串可以在任何一个命令的后面,比如 
String str="%3D%0I%1S%0F%1J%85C%85C%85C%6SRRR-400ms%0F%0S%Z"
和上面的字符串的效果是一样的,
其实这个问题就是一个字符传串的拆分问题,怎么拆分比较合理,我java刚入行,请比较熟悉的帮帮忙,写点建议。
 

解决方案 »

  1.   

    String str="%3D%0I%1S%0F%1J%85C%85C%85CRRR-400ms%6S%0F%0S%Z";

    Pattern p = Pattern.compile("%(\\d+)([A-Z])");

    Matcher m = p.matcher(str);

    while(m.find()) {
    String g = m.group(1);
    String g2 = m.group(2);
    System.out.println(g2 + ":" + g);
    }
      

  2.   

    for example
    String str = "%3D%0I%1S%0F%1J%85C%85C%85CRRR-400ms%6S%0F%0S%Z";
    String[] sa = str.replaceAll("^%(.*)", "$1").split("%");
    for (String s : sa) {
        if (s.matches("\\d+[A-Za-z]")) {
            System.out.printf("%s:%s\n", s.replaceAll("\\D+", ""), s.replaceAll("\\d+", ""));
        } else if (s.matches(".*?RRR-\\d+ms")) {
            String v = s.replaceAll("(.*?)RRR-\\d+ms", "$1");
            if (v.matches("\\d+[A-Za-z]")) {
                System.out.printf("%s:%s\n", v.replaceAll("\\D+", ""), v.replaceAll("\\d+", ""));
            } else if (v.trim().length() > 0) {
                System.out.println(v);
            }
            System.out.println(s.replaceAll(".*?(RRR-\\d+ms)", "$1"));
        } else {
            System.out.println(s);
        }
    }
      

  3.   

    数字和字符输出顺序反了,修改一下
    String str = "%3D%0I%1S%0F%1J%85C%85C%85CRRR-400ms%6S%0F%0S%Z";
    String[] sa = str.replaceAll("^%(.*)", "$1").split("%");
    for (String s : sa) {
        if (s.matches("\\d+[A-Za-z]")) {
            System.out.printf("%s:%s\n", s.replaceAll("\\d+", ""), s.replaceAll("\\D+", ""));
        } else if (s.matches(".*?RRR-\\d+ms")) {
            String v = s.replaceAll("(.*?)RRR-\\d+ms", "$1");
            if (v.matches("\\d+[A-Za-z]")) {
                System.out.printf("%s:%s\n", v.replaceAll("\\d+", ""), v.replaceAll("\\D+", ""));
            } else if (v.trim().length() > 0) {
                System.out.println(v);
            }
            System.out.println(s.replaceAll(".*?(RRR-\\d+ms)", "$1"));
        } else {
            System.out.println(s);
        }
    }
      

  4.   


    Pattern p = Pattern.compile("%(\\d+)([A-Z])");求解释上面的这句话。
      

  5.   

    %就是字符%
    ()是一个组
    \\d表示数字
    +表示1个或多个
    [A-Z]表示字母A-Z的任意一个
    话说,这个正则拿不到%85CRRR-400ms字符串的
      

  6.   


    正则表达式的使用方法。  \\d是指数字。  \\d+指0个或多个数字
    A-Z是指大写的A到Z之间的字母
      

  7.   

    for example
    String str = "%3D%0I%1S%0F%1J%85C%85C%85CRRR-400ms%6S%0F%0S%Z";
    Pattern p = Pattern.compile("%([^%]+)"); //按这样的正则可以取道%85CRRR-400ms
    Matcher m = p.matcher(str);
    while (m.find()) { //不过以下的处理和上面的split方法是换汤不换药,核心处理一样
        String s = m.group(1); 
        if (s.matches("\\d+[A-Z]")) {
            System.out.printf("%s:%s\n", s.replaceAll("\\d+", ""), s.replaceAll("\\D+", ""));
        } else if (s.matches(".*?RRR-\\d+ms")) {
            String v = s.replaceAll("(.*?)RRR-\\d+ms", "$1");
            if (v.matches("\\d+[A-Z]")) {
                System.out.printf("%s:%s\n", v.replaceAll("\\d+", ""), v.replaceAll("\\D+", ""));
            } else {
                System.out.println(v);
            }
            System.out.println(s.replaceAll(".*?(RRR-\\d+ms)", "$1"));
        } else {
            System.out.println(s);
        }
    }
      

  8.   

    独立字符串如果只是RRR-400ms的格式就很好拿了。
      

  9.   

    String str = "%3D%0I%1S%0F%1J%85C%85C%85CRRR-400ms%6S%0F%0S%Z";
    String[] sa = str.replaceAll("^%(.*)", "$1").split("%");
    for (String s : sa) {
        if (s.matches("\\d+[A-Za-z]")) {
            System.out.printf("%s:%s\n", s.replaceAll("\\D+", ""), s.replaceAll("\\d+", ""));
        } else if (s.matches(".*?RRR-\\d+ms")) {
            String v = s.replaceAll("(.*?)RRR-\\d+ms", "$1");
            if (v.matches("\\d+[A-Za-z]")) {
                System.out.printf("%s:%s\n", v.replaceAll("\\D+", ""), v.replaceAll("\\d+", ""));
            } else if (v.trim().length() > 0) {
                System.out.println(v);
            }
            System.out.println(s.replaceAll(".*?(RRR-\\d+ms)", "$1"));
        } else {
            System.out.println(s);
        }
    }
      

  10.   

    String str = "%3D%0I%1S%0F%1J%85C%85C%85CRRR-400ms%6S%0F%0S%Z"; String regex = "(\\d{1,3})([A-Z])";
    Matcher m = Pattern.compile("%" + regex).matcher(str); while (m.find()) {
    Matcher t_m = Pattern.compile(regex).matcher(m.group());
    t_m.find();
    System.out.println(t_m.group(2) + ":" + t_m.group(1)); str = str.replaceAll(m.group(), ",");
    }

    for (String _str : str.split(",")) {
    if ("".equals(_str)) continue;
    System.out.println(_str);
    }
    }
      

  11.   

    String str="%3D%0I%1S%0F%1J%85C%85C%85CRRR-400ms%6S%0F%0S%Z"
     
    分析其特点可以知道除去RRR-400ms,每一段都是%数字字母,对于这种规则的形式可以考虑用正则表达式
    Pattern p = Pattern.compile("%(\\d+)([A-Z])");就可以得到
    D:3
    I:0
    S:1
    F:0
    J:1
    C:85
    S:6
    F:0
    S:0
    当然拆分时要判断是否遇到%Z,是则结束,独立字符串另作考虑匹配就好,没必要设计的那么复杂
      

  12.   

     字符串“RRR-400ms”不是固定的,可能是其他的字符串,还有可能包含特殊字符%, 如果包含特殊字符%,就必须是两个%相邻,表示输出一个%,例如: 字符串 "98%%" 表示 "98%"
      

  13.   

    如何把 字符串 str1="85CRRR-400ms"  拆分成  str2="85C" 和 str3="RRR-400ms" 
    其中 ,str2="85C" 中的85可能是 0-255之间的任意整数,C 可能是 A-Z任意字母,str3="RRR-400ms" 并不是固定的值,可能是任意其他的字符串。
      

  14.   

    上面的代码不是有的吗
    String str1="85CRRR-400ms"
    String str2 = str1.replaceAll("(.*?)RRR-\\d+ms", "$1");
    String str3 = str1.replaceAll(".*?(RRR-\\d+ms)", "$1");
    或者
    String str2 = str1.replaceAll("(\\d+[A-Z]).*", "$1");
    String str3 = str1.replaceAll("\\d+[A-Z](.*)", "$1");
      

  15.   

    String str = "%3D%0I%1S%0F%1J%85C%85C%85CRRR-400ms%6S%0F%0S%Z";
    String[] sa = str.replaceAll("^%(.*)", "$1").split("%");
    for (String s : sa) {
        if (s.matches("\\d+[A-Za-z]")) {
            System.out.printf("%s:%s\n", s.replaceAll("\\d+", ""), s.replaceAll("\\D+", ""));
        } else if (s.matches(".*?RRR-\\d+ms")) {
            String v = s.replaceAll("(.*?)RRR-\\d+ms", "$1");
            if (v.matches("\\d+[A-Za-z]")) {
                System.out.printf("%s:%s\n", v.replaceAll("\\d+", ""), v.replaceAll("\\D+", ""));
            } else if (v.trim().length() > 0) {
                System.out.println(v);
            }
            System.out.println(s.replaceAll(".*?(RRR-\\d+ms)", "$1"));
        } else {
            System.out.println(s);
        }
    }
      

  16.   

    package com.one;import java.util.regex.Matcher;
    import java.util.regex.Pattern;public class StringTest { /**
     * @param args
     */
    public static void main(String[] args) {
    String str="%3D%0I%1S%0F%1J%85C%85C%85CRRR-400ms%6S%0F%0S%Z";
    StringTest tt=new StringTest();
    //得到%3D%0I%1S%0F%1J%85C%85C%85CRRR-400ms%6S%0F%0S的部分
    String[] res1=tt.getCommand(str);
    for(int i=0;i<res1.length;i++){
    //得到%3D%0I%1S%0F%1J%85C%85C%85C的部分
    String[] com=tt.spiltWithRRR(res1[i]);
    for(int k=0;k<com.length;k++){
    //得到3D的部分
    String[] num=com[k].split("%");
    for(int j=0;j<num.length;j++){
    tt.getCell(num[j]);
    }
    }
    }

    }
    /**
     * 按%Z分,得到命令数组
     * @param str
     * @return
     */
    public String[] getCommand(String str){
    String[] res=null;
    res=str.split("%Z");
    this.printResult(res);
    return res;
    }
    /**
     * 按RRR-400ms分
     * @param str
     * @return
     */
    public String[] spiltWithRRR(String str){
    String[] res=null;
    res=str.split("RRR-400ms");
    this.printResult(res);
    return res;
    }
    /**
     * 打印一个数组的内容
     * @param ss
     */
    public void printResult(String[] ss){
    for(int i=0;i<ss.length;i++){
    System.out.println(ss[i]);
    }
    }
        /**
         * 数字字母换位
         * @param str
         * @return
         */
    public String getCell(String str){
    String res=null;
    String re1=null;
    String re2=null;
    if((str==null)||(str.trim().equals(""))){

    }else{
    Pattern p = Pattern.compile("\\d+");
    Matcher m = p.matcher(str);
    Pattern p2 = Pattern.compile("[A-Z]+");
    Matcher m2 = p2.matcher(str); while(m.find()) {
    re1 = m.group();
    }
    while(m2.find()) {
        re2 = m2.group();
    }
    res=re2+":"+re1;
    System.out.println(res);
    }
    return res;
    }}
    打印:
    %3D%0I%1S%0F%1J%85C%85C%85CRRR-400ms%6S%0F%0S
    %3D%0I%1S%0F%1J%85C%85C%85C
    %6S%0F%0S
    D:3
    I:0
    S:1
    F:0
    J:1
    C:85
    C:85
    C:85
    S:6
    F:0
    S:0
      

  17.   

    改一下:

    package com.one;import java.util.regex.Matcher;
    import java.util.regex.Pattern;public class StringTest { /**
     * @param args
     */
    public static void main(String[] args) {
    String str="%3D%0I%1S%0F%1J%85C%85C%85CRRR-400ms%6S%0F%0S%Z";
    StringTest tt=new StringTest();
    //得到%3D%0I%1S%0F%1J%85C%85C%85CRRR-400ms%6S%0F%0S的部分
    String[] res1=tt.getCommand(str);
    for(int i=0;i<res1.length;i++){
    //得到%3D%0I%1S%0F%1J%85C%85C%85C的部分
    String[] com=tt.spiltWithRRR(res1[i]);
    for(int k=0;k<com.length;k++){
    //得到3D的部分
    String[] num=com[k].split("%");
    String tem=null;
    for(int j=0;j<num.length;j++){
    tt.getCell(tem,num[j]);
    tem=num[j];
    }
    }
    }

    }
    /**
     * 按%Z分,得到命令数组
     * @param str
     * @return
     */
    public String[] getCommand(String str){
    String[] res=null;
    res=str.split("%Z");
    this.printResult(res);
    return res;
    }
    /**
     * 按RRR-400ms分
     * @param str
     * @return
     */
    public String[] spiltWithRRR(String str){
    String[] res=null;
    res=str.split("RRR-400ms");
    this.printResult(res);
    return res;
    }
    /**
     * 打印一个数组的内容
     * @param ss
     */
    public void printResult(String[] ss){
    for(int i=0;i<ss.length;i++){
    System.out.println(ss[i]);
    }
    }
        /**
         * 数字字母换位
         * @param str
         * @return
         */
    public String getCell(String tem,String str){
    String res=null;
    String re1=null;
    String re2=null;
    if((str==null)||(str.trim().equals(""))){

    }else if(tem.trim().equals(str.trim())){

    }else{
    Pattern p = Pattern.compile("\\d+");
    Matcher m = p.matcher(str);
    Pattern p2 = Pattern.compile("[A-Z]+");
    Matcher m2 = p2.matcher(str); while(m.find()) {
    re1 = m.group();
    }
    while(m2.find()) {
        re2 = m2.group();
    }
    res=re2+":"+re1;
    System.out.println(res);
    }
    return res;
    }}
    打印:

    %3D%0I%1S%0F%1J%85C%85C%85CRRR-400ms%6S%0F%0S
    %3D%0I%1S%0F%1J%85C%85C%85C
    %6S%0F%0S
    D:3
    I:0
    S:1
    F:0
    J:1
    C:85
    S:6
    F:0
    S:0