hongchenshijie
红尘丶世界
采纳率66.7%
2020-10-14 01:20 阅读 72

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

字符串如下

"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"

求大神指点, 或提供一下思路.

  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 复制链接分享

2条回答 默认 最新

  • 已采纳
    duanluan 欲穷三千界 2020-10-15 15:07

    正则: (?=[a-z]+=)

    Java 代码:

    "act=abc aaa=zzz bbb zzz cc=ddd dd=aa bb cc".replaceAll(" (?=[a-z]+=)", "&");
    

    点赞 2 评论 复制链接分享
  • qq_42235984 _YuLF 2020-10-14 10:22
    /**
         * 我的思路:
         * 必须保证这个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
    

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

    点赞 评论 复制链接分享

相关推荐