jive中StringUtils的一些方法的研究

我们经常在代码中使用String的replace方法和replaceAll方法,但JDK的类调用比较复杂,下面我们看看jive中的实现:
 public static final String replace(String line, String oldString,
			String newString) {
		if (line == null) {
			return null;
		}
		int i = 0;
		if ((i = line.indexOf(oldString, i)) >= 0) {
			char[] line2 = line.toCharArray();
			char[] newString2 = newString.toCharArray();
			int oLength = oldString.length();
			StringBuffer buf = new StringBuffer(line2.length);
			buf.append(line2, 0, i).append(newString2); //拷贝串开始到目标字符出现的字符,再加上要替换的字符
			i += oLength;
			int j = i;
			//查找后面出现的原字符
			while ((i = line.indexOf(oldString, i)) > 0) {
				//拷贝两次出现的中间的字符,再加上要替换的字符
				buf.append(line2, j, i - j).append(newString2);
				i += oLength;
				j = i;
			}
			//把最后没有替换的字符加到后面
			buf.append(line2, j, line2.length - j);
			return buf.toString();
		}
		return line;
	}

理解了上面的代码,再理解忽略大小写的代码就容易多了。
 private static String replaceIngoreCase(String line,String oldString,String newString){
    	if(line == null){
    		return null;
    	}
    	int i = 0;
    	String lcLine = line.toLowerCase();
    	String lcOldString = oldString.toLowerCase();
    	if((i = lcLine.indexOf(lcOldString,i)) != -1){
    		char[] line2 = line.toCharArray();
    		char[] newString2 = newString.toCharArray();
    		StringBuffer buf = new StringBuffer(line2.length);
    		int oLength = oldString.length();
    		buf.append(line2,0,i).append(newString2);
    		i += oLength;
    		int j = i;
    		while((i = lcLine.indexOf(lcOldString,i)) != -1){
    			buf.append(line2,j,i - j).append(newString2);
    			i += oLength;
    			j = i;
    		}
    		buf.append(line2,j,line2.length - j);
    		return buf.toString();
    	}
    	return line;
    }

主要是将要替换的串,和源字符转为小写,替换为目标字符,思路很上面的差不多。
还有一些经常使用的一些比如HTML、XML一些特殊字符的一些过滤:
public static final String escapeHTMLTags(String in) {
        if (in == null) {
            return null;
        }
        char ch;
        int i=0;
        int last=0;
        char[] input = in.toCharArray();
        int len = input.length;
        StringBuffer out = new StringBuffer((int)(len*1.3)); //这里的初始化容量,初步为原来的1.3倍。
        for (; i < len; i++) {
            ch = input[i];
            if (ch > '>') {
                continue;
            } else if (ch == '<') {
                if (i > last) {
                    out.append(input, last, i - last);
                }
                last = i + 1;
                out.append(LT_ENCODE); // LT_ENCODE="&lt;"
            } else if (ch == '>') {
                if (i > last) {
                    out.append(input, last, i - last);
                }
                last = i + 1;
                out.append(GT_ENCODE); // GT_ENCODE = "&gt;"
            }
        }
        if (last == 0) {
            return in;
        }
        if (i > last) { //直接拷贝后面的非HTML字符
            out.append(input, last, i - last);
        }
        return out.toString();
    }

方法看起来还是比较简单的。
那我们在看看关于XML替换的,在XML中&也也是一个特殊字符,
public static final String escapeForXML(String in) {
        if (in == null) {
            return null;
        }
        char ch;
        int i=0;
        int last=0;
        char[] input = in.toCharArray();
        int len = input.length;
        StringBuffer out = new StringBuffer((int)(len*1.3));
        for (; i < len; i++) {
            ch = input[i];
            if (ch > '>') {
                continue;
            } else if (ch == '<') {
                if (i > last) {
                    out.append(input, last, i - last);
                }
                last = i + 1;
                out.append(LT_ENCODE);
            } else if (ch == '&') {
                if (i > last) {
                    out.append(input, last, i - last);
                }
                last = i + 1;
                out.append(AMP_ENCODE); // AMP_ENCODE = "&amp;"
            } else if (ch == '"') {
                if (i > last) {
                    out.append(input, last, i - last);
                }
                last = i + 1;
                out.append(QUOTE_ENCODE);
            }
        }
        if (last == 0) {
            return in;
        }
        if (i > last) {
            out.append(input, last, i - last);
        }
        return out.toString();
    }

方法差不多.

   其实在实际编程过程中我们经常使用commones-utils.jar里面的StringUtil,或者Spring里面带的一些Util方法,或者社区里面一些爱好者写的Util类,只要大概知道他们是怎么实现的,用他们的还是可以节省很多时间。

你可能感兴趣的:(spring,jdk,编程,xml,J#)