首页

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

标签:字符串替换,高效,高性能,正则,算法,性能优化,数据结构,Pattern,String,查询匹配,java基础     发布时间:2016-04-13   

一、前言

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

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

二、实施案例

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)@b@        {@b@            if(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_1<len_s)@b@            temp=temp+str.substring(pos_1);@b@@b@        if(temp.length()>0)@b@            ret=temp;@b@@b@        return(ret);@b@    }