解决方案 »

  1.   

    \\r
    转义了\ 变为r 了\\\r 就可以了。
      

  2.   

    使用replaceAll允许使用正则表达式,当替换值里有'\'时 可能结果会和看上去不同,你用repleace就能理解了。为什么少个'\',还请大神解释原因
      

  3.   


    \\r 转义了\ ,不是成了字符串值 \r 了吗?s3 把原来的换行符转换成字符串“\r”,打印出来还不是换行? 而 s2 = s.replaceAll("\r", "\r") ,是把换行符转换成换行符,自然是没变化。
    我哪里想错了?想不通啊。
      

  4.   

    看debug
    String s = "工作\r";     
    System.out.println("s = "+s);----->  "s"= "工作\\r"             
            System.out.println("s1 = "+s.replaceAll("\r", "r")); "s.replaceAll("\\r", "r")"= "工作r" 
            System.out.println("s2 = "+s.replaceAll("\r", "\r"));"s.replaceAll("\\r", "\\r")"= "工作\\r" 
            System.out.println("s3 = "+s.replaceAll("\r", "\\r"));----->  s.replaceAll("\\r", "\\\\r")"= "工作r"  
      

  5.   

    跟踪下源码,或许能理解:String 类的replaceAll方法是:    public String replaceAll(String regex, String replacement) {
    return Pattern.compile(regex).matcher(this).replaceAll(replacement);
        }可见是调用了Matcher里的replaceAll方法。
        public String replaceAll(String replacement) {
            reset();
            boolean result = find();
            if (result) {
                StringBuffer sb = new StringBuffer();
                do {
                    appendReplacement(sb, replacement);//看下面这个方法
                    result = find();
                } while (result);
                appendTail(sb);
                return sb.toString();
            }
            return text.toString();
        }...
    ...
    ...    public Matcher appendReplacement(StringBuffer sb, String replacement) {        // If no match, return error
            if (first < 0)
                throw new IllegalStateException("No match available");        // Process substitution string to replace group references with groups
            int cursor = 0;
            String s = replacement;
            StringBuffer result = new StringBuffer();        while (cursor < replacement.length()) {
                char nextChar = replacement.charAt(cursor);
                if (nextChar == '\\') {//这块对'\'的处理是第一次遇到这个'\',跳过了。直接取后边的字符。
                    cursor++;
                    nextChar = replacement.charAt(cursor);
                    result.append(nextChar);
                    cursor++;
                } else if (nextChar == '$') {
                    // Skip past $
                    cursor++;                // The first number is always a group
                    int refNum = (int)replacement.charAt(cursor) - '0';
                    if ((refNum < 0)||(refNum > 9))
                        throw new IllegalArgumentException(
                            "Illegal group reference");
                    cursor++;                // Capture the largest legal group string
                    boolean done = false;
                    while (!done) {
                        if (cursor >= replacement.length()) {
                            break;
                        }
                        int nextDigit = replacement.charAt(cursor) - '0';
                        if ((nextDigit < 0)||(nextDigit > 9)) { // not a number
                            break;
                        }
                        int newRefNum = (refNum * 10) + nextDigit;
                        if (groupCount() < newRefNum) {
                            done = true;
                        } else {
                            refNum = newRefNum;
                            cursor++;
                        }
                    }                // Append group
                    if (group(refNum) != null)
                        result.append(group(refNum));
                } else {
                    result.append(nextChar);
                    cursor++;
                }
            }        // Append the intervening text
            sb.append(getSubSequence(lastAppendPosition, first));
            // Append the match substitution
            sb.append(result.toString());        lastAppendPosition = last;
    return this;
        } 
      

  6.   

    因为\在Java和正则表达式中都是转义字符,所以需要四个\表示一个\