跟踪下源码,或许能理解: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; }
转义了\ 变为r 了\\\r 就可以了。
\\r 转义了\ ,不是成了字符串值 \r 了吗?s3 把原来的换行符转换成字符串“\r”,打印出来还不是换行? 而 s2 = s.replaceAll("\r", "\r") ,是把换行符转换成换行符,自然是没变化。
我哪里想错了?想不通啊。
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"
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;
}