java使用正则表达式\\r和\\\\r和\\\\\\r来split字符串结果为啥一样

Java源代码中的字符串中的反斜线会被当成转义的,比如你来个String s = "\\(";编译是会错的,说什么非法转义字符。所以你这个字符串String s = "a\\rbc";其实是什么东西啊,一个a一个回车一个b一个c四个字符组成的字符串。String split = s.split("\\r"); // 匹配\u0026#39;\\r\u0026#39;这个字符String split1 = s.split("\\\\r"); // 匹配回车符String split2 = s.split("\\\\\\r"); // 参数是由\u0026#39;\\\u0026#39;和\u0026#39;\\r\u0026#39;组成的字符串这个split方法的参数是一个正则表达式,然后呢这个\\r(这个真是捉急啊,一个反斜线和一个字母r组成的字符串)能匹配回车符,怎么表示由一个反斜线和一个字母r组成的字符串呢,用"\\\\r"。所以s.split("\\\\r");匹配的就是回车符,那个s里面有回车符吗,有啊,第二个字符不就是么。然后,s.split("\\r");是个什么东西,里面的参数就是一个字符(回车符)。s.split("b")这个好理解吧,里面参数就是一个字符(b),用b去切 和 用回车符去切 道理一样的哈。最后看这个,s.split("\\\\\\r");这个参数是由一个反斜杠和一个回车符这两个字符组成的字符串,最后去切的时候其实是用的回车符去切的,换句话说这种情况和s.split("\\r");是一样的。内部实现在这:public String split(String regex, int limit) {/* fastpath if the regex is a (1)one-char String and this character is not one of the RegEx\u0026#39;s meta characters ".$|(){this}; // Add remaining segment if (!limited || list.size() \u0026lt; limit) list.add(substring(off, value.length)); // Construct result int resultSize = list.size(); if (limit == 0) {while (resultSize \u0026gt; 0 \u0026amp;\u0026amp; list.get(resultSize - 1).length() == 0) { resultSize--; } } String result = new String; return list.subList(0, resultSize).toArray(result); } /* 只有第二个参数会进入到这里,使用正则表达式的规则去匹配,前面的都是简单的比较单个字符 */return Pattern.compile(regex).split(this, limit);}


    推荐阅读