字符串如下
"act=abc aaa=zzz bbb zzz cc=ddd dd=aa bb cc"
这是一个kv字符串我想把每个kv中间的空格替换成&符
每一个kv是以空格切分,键与值之间是通过=切分的
替换后的效果为
"act=abc&aaa=zzz bbb zzz&cc=ddd&dd=aa bb cc"
求大神指点, 或提供一下思路.
正则: (?=[a-z]+=)
Java 代码:
"act=abc aaa=zzz bbb zzz cc=ddd dd=aa bb cc".replaceAll(" (?=[a-z]+=)", "&");
/**
* 我的思路:
* 必须保证这个oldStr 包含一个K v键值
* 1.根据=号找到一共存在多少个键值对
* 2.截取str第一个=号前面的值为键
* 3.在剩下的字符串中,以第一个=号截取在里面找到最后一个空格前的值为Value
* 4.在第一个KV截取之后,重新定义str,保证下一次的截取
* 这种方式还有很多完善的方式,当然你也可以选择更好的方式
* @param args
*/
public static void main(String[] args) {
String oldStr = "act=abc aaa=zzz bbb zzz cc=ddd dd=aa bb cc";
//act=abc&aaa=zzz bbb zzz&cc=ddd&dd=aa bb cc
replaceStr(oldStr);//字符串替换
}
//第一种方式
public static Map<String,String> replaceStr(String str){
Map<String,String> map =new HashMap<String,String>();
//寻找一个有多少个Kv
String[] split = str.split("=");
for (int i = 0;i<split.length-1;i++){
//key
//System.out.println("每次提取后KV后面的字符串:"+str);
String key = str.substring(0,str.indexOf("="));
//除Key之后的剩余字符串
String surplusValue= str.substring(str.indexOf("=")+1,str.length());
//找出value
map.put(key,findVal(surplusValue));
//重新定义后面的KV字符串
str = reLocationStr(surplusValue);
}
Iterator<Map.Entry<String, String>> iterator = map.entrySet().iterator();
String res = "";
while(iterator.hasNext()){
Map.Entry<String, String> next = iterator.next();
System.out.println("提取后的Key:"+next.getKey() + "提取后的Val:"+next.getValue());
//组装成你想要的格式
res += next.getKey() +"=" + next.getValue()+"&";
}
System.out.println(res.substring(0,res.lastIndexOf("&")));
return map;
}
/**
* 重新定义需要截取的KV
* @param surplusValue=abc aaa=zzzz bbb zz cc=ddd dd=aa bb cc 第一次的参数值
* @return
*/
private static String reLocationStr(String surplusValue) {
if(surplusValue.contains("=")){
//找到下一个Key的下标
String s = surplusValue.substring(0, surplusValue.indexOf("="));
int nextKeyIndex = s.lastIndexOf(" ");
return surplusValue.substring(nextKeyIndex+1,surplusValue.length());
} else{
return surplusValue;
}
}
/**
* 寻找Key前面的第一个空格前面的值为Val,如果有的话
* @param surplusValue=abc aaa=zzzz bbb zz cc=ddd dd=aa bb cc 第一次的参数值
* @return
*/
private static String findVal(String surplusValue) {
if(surplusValue.contains("=")&&surplusValue.contains(" ")){
//key后面的value和下一个key的字符串
String s = surplusValue.substring(0, surplusValue.indexOf("="));
//截取value
return s.contains(" ") ? s.substring(0,s.lastIndexOf(" ")) : s.substring(0,s.length());
}else{
//最后一个值
return surplusValue.contains("=") ? surplusValue.substring(0,surplusValue.indexOf("=")) : surplusValue;
}
}
打印效果:
提取后的Key:aaa提取后的Val:zzz bbb zzz
提取后的Key:cc提取后的Val:ddd
提取后的Key:dd提取后的Val:aa bb cc
提取后的Key:act提取后的Val:abc
aaa=zzz bbb zzz&cc=ddd&dd=aa bb cc&act=abc
最好的方式不是用字符串截取的方式,因为在此之前,需要对参数做好足够的判断,且不利于维护,正则哪位大神下面奉上...