在Java中用正则表达式转义双斜杠

在Java中用正则表达式转义双斜杠,java,regex,string,unicode,replaceall,Java,Regex,String,Unicode,Replaceall,我有一个单元测试: public void testDeEscapeResponse() { final String[] inputs = new String[] {"peque\\\\u0f1o", "peque\\u0f1o"}; final String[] expected = new String[] {"peque\\u0f1o", "peque\\u0f1o"}; for (int i = 0; i < inputs.length; i++) {

我有一个单元测试:

public void testDeEscapeResponse() {
    final String[] inputs = new String[] {"peque\\\\u0f1o", "peque\\u0f1o"};
    final String[] expected = new String[] {"peque\\u0f1o", "peque\\u0f1o"};
    for (int i = 0; i < inputs.length; i++) {
        final String input = inputs[i];
        final String actual = QTIResultParser.deEscapeResponse(input);
        Assert.assertEquals(
            "deEscapeResponse did not work correctly", expected[i], actual);
    }
}
单元测试失败,出现以下错误:

java.lang.StringIndexOutOfBoundsException: String index out of range: 1
    at java.lang.String.charAt(String.java:686)
    at java.util.regex.Matcher.appendReplacement(Matcher.java:703)
    at java.util.regex.Matcher.replaceAll(Matcher.java:813)
    at java.lang.String.replaceAll(String.java:2189)
    at com.acme.MyClass.deEscapeResponse
    at com.acme.MyClassTest.testDeEscapeResponse
为什么?

使用进行文字替换的,而不是使用正则表达式的

示例:

"peque\\\\u0f1o".replace("\\\\", "\\")    //  gives  peque\u0f1o

String.replaceAll
采用正则表达式,因此
\\\\\\
被解释为表达式
\\\
,该表达式反过来与单个
\
匹配。(替换字符串还对
\
进行了特殊处理,因此也存在错误。)

要使
String.replaceAll
像您在这里期望的那样工作,您需要执行以下操作

"peque\\\\u0f1o".replaceAll("\\\\\\\\", "\\\\")
请参阅javadoc以了解:

注意反斜杠(\)和美元 替换字符串中的符号($) 可能会导致结果不同 如果它被视为 文字替换字符串。美元 符号可被视为参考 捕获的子序列如所述 和反斜杠用于 中的转义文字字符 替换字符串


因此,使用
replaceAll
不能用反斜杠替换任何内容。因此,对于您的案例来说,一个非常疯狂的解决方法是
str.replaceAll(“\\\\\(\\\\)”,“$1”)

我认为问题在于您使用的是replaceAll()而不是replace()。replaceAll在第一个字段中需要一个正则表达式,而您只是在尝试字符串匹配。

您知道,我曾考虑过使用replace,但我认为它与replaceAll完全相同,只是它只替换了第一个实例。谢谢啊,我明白为什么当有一个replaceAll方法时你会这么想:-)…尽管实际上有一个方法:-)
"peque\\\\u0f1o".replaceAll("\\\\\\\\", "\\\\")