请教一个关于正则的问题,我想替换一段字符串中的部分空格请问该如何使用正则进行替换?

字符串如下

"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

最好的方式不是用字符串截取的方式,因为在此之前,需要对参数做好足够的判断,且不利于维护,正则哪位大神下面奉上...