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刚入行,请比较熟悉的帮帮忙,写点建议。
最后需要得到拆分的结果是:
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刚入行,请比较熟悉的帮帮忙,写点建议。
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);
}
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);
}
}
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);
}
}
Pattern p = Pattern.compile("%(\\d+)([A-Z])");求解释上面的这句话。
()是一个组
\\d表示数字
+表示1个或多个
[A-Z]表示字母A-Z的任意一个
话说,这个正则拿不到%85CRRR-400ms字符串的
正则表达式的使用方法。 \\d是指数字。 \\d+指0个或多个数字
A-Z是指大写的A到Z之间的字母
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);
}
}
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);
}
}
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);
}
}
分析其特点可以知道除去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,是则结束,独立字符串另作考虑匹配就好,没必要设计的那么复杂
其中 ,str2="85C" 中的85可能是 0-255之间的任意整数,C 可能是 A-Z任意字母,str3="RRR-400ms" 并不是固定的值,可能是任意其他的字符串。
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");
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);
}
}
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
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