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