使用lookahead和反斜杠在replaceAll上的StringIndexOutOfBoundsException?

时间:2015-03-17 02:07:54

标签: java regex replaceall

我想要转义字符串的所有引号(单引号和双引号)和反斜杠。

我试图通过调用myString.replaceAll来做到这一点。匹配和替换的正则表达式是(?=['\"\\\\])(转义的Java语法),或者更具可读性:(?=['!\])(非转义语法)。 我做了一个先行,因为我想保留那些引号和反斜杠,只需在它们之前插入一个转义字符。

如果我使用+作为转义字符,那么一切都像魅力(下面的所有字符串都是转义的Java语法):

"abc'def\"ghi\\jkl".replaceAll("(?=['\"\\\\])", "+")会产生"abc+'def+\"ghi+\\jkl"。耶!

但是,如果我使用反斜杠作为转义字符,我会得到一个StringIndexOutOfBoundsException:String index out of range: 1

电话看起来像这样: "abc'def\"ghi\\jkl".replaceAll("(?=['\"\\\\])", "\\\\")

奇怪的是......插入的反斜杠会以某种方式干扰前瞻性正则表达式中的反斜杠吗?如果是这样,我该如何避免这种行为?

以下是完整的测试代码:

import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
import org.junit.Test;

public class RegexTest {
    @Test public void test() {
        assertEquals("abc\\'def\\\"ghi\\\\jkl", "abc'def\"ghi\\jkl".replaceAll("(?=['\"\\\\])", "\\\\"));
    }
}

非常感谢任何帮助!

0 个答案:

没有答案