java的replaceall_比String.replaceAll替换字符串更高效的实施算法推荐

一、前言

Java的lang包的String字符串全替换方法replaceAll方法(如下图所示)是基于正则的替换方法,而正则匹配是基于个强大的匹配算法Pattern模型做支持(多维度数据存储结构适应任意的字符串组合类型,复杂的规则字典库支持Matcher),对应我们要实现一个简单的字符串替换逻辑,真是大材小用,同时性能也比较慢,所以建议还是自定义。

ef4e34a3c0245c1bcb48212be8d0e99b.png

二、实施案例

1. 参考算法一,如下所示/**@b@     * 通过简单indexOf查找位置,indexOf方法本身基于char数组变量来定位 @b@     * @param source 源字符串@b@     * @param searchString 匹配字符串@b@     * @param replaceString 目标字符串 @b@     * @return 返回结果@b@     */@b@ public static String replaceAll(String source, String searchString, String replaceString) {@b@@b@        if (source == null) {@b@            return null;@b@        }@b@@b@        if (isEmpty(searchString)) {@b@            return source;@b@        }@b@@b@        if (replaceString == null) {@b@            replaceString = "";@b@        }@b@        int len = source.length();@b@        int sl = searchString.length();@b@        int rl = replaceString.length();@b@        int length;@b@        if (sl == rl) {@b@            length = len;@b@        } else {@b@            int c = 0;@b@            int s = 0;@b@            int e;@b@            while ((e = source.indexOf(searchString, s)) != -1) {@b@                c++;@b@                s = e + sl;@b@            }@b@            if (c == 0) {@b@                return source;@b@            }@b@            length = len - (c * (sl - rl));@b@        }@b@@b@        int s = 0;@b@        int e = source.indexOf(searchString, s);@b@        if (e == -1) {@b@            return source;@b@        }@b@        StringBuffer sb = new StringBuffer(length);@b@        while (e != -1) {@b@            sb.append(source.substring(s, e));@b@            sb.append(replaceString);@b@            s = e + sl;@b@            e = source.indexOf(searchString, s);@b@        }@b@        e = len;@b@        sb.append(source.substring(s, e));@b@        return sb.toString();@b@    }

2. 参考算法二,如下所示/**@b@     * 替换String中的字符串.@b@     * 在标准的String类中只有将String中的某一个字符替换成另一个字符,该函数可以将String@b@     * 中的某一字符串替换成另一个字符串.@b@     * @param str0 源字符串 tag 将要被替换的字符串 news 将要替换的字符串@b@     * @return 将源字符串替换后的字符串@b@     */@b@    public static String replaceAll2(String str,String tag,String news)@b@    {@b@        if(str==null||str.length()==0||tag==null||tag.length()==0)@b@            return(str);@b@        String ret=str,temp="";@b@        String l_str;@b@        int len_s=str.length();@b@        int len_t=tag.length();@b@        int pos_1=0,pos_2=0;@b@        int i=0;@b@        while(i=(len_s-len_t))@b@                l_str=str.substring(i);@b@            else@b@                l_str=str.substring(i,i+len_t);@b@            if(l_str.equals(tag))@b@            {@b@                pos_2=i;@b@                temp=temp+str.substring(pos_1,pos_2)+news;@b@                i=i+len_t;@b@                pos_1=i;@b@            }@b@            else@b@                i++;@b@        }@b@        if(pos_10)@b@            ret=temp;@b@@b@        return(ret);@b@    }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值