Java String.replaceAll不替换带有转义引用的引号

时间:2011-08-26 06:22:25

标签: java

很难用转义引号替换报价。我有一个字符串,其值为'Foo'bar“foobar”,我试图用转义引号替换bar周围的引号,但它无效。我快疯了。

s=s.replaceAll("\"","\\\"");

我希望s的值为'foo \“bar \”foobar',但事实并非如此。有什么帮助吗?

7 个答案:

答案 0 :(得分:19)

replaceAll使用正则表达式 - 反斜杠只会逃避下一个字符,即使在替换中也是如此。

使用replace代替它,如果你想使用正则表达式形式,你可以在第二个参数中加倍反斜杠:

String after = before.replaceAll("\"", "\\\\\"");

如果您需要使用正则表达式匹配输入,这可能很有用,但我强烈建议您使用非正则表单形式,除非您实际上需要正则表达式行为。

我个人认为String中使用正则表达式开头的方法是错误的 - foo.split(".")之类的内容会分散在每个字符而不是句点上对于那些粗心大意的开发人员来说,这是完全出乎意料的。

答案 1 :(得分:10)

使用s = s.replace("\"", "\\\"");,这是非正则表达式版本。

答案 2 :(得分:2)

你需要转义两个替换所有参数,因为它们是正则表达式!

@Test
public void testReplace() {
    assertEquals("foo\\\"bar\\\"",
                 "foo\"bar\"".replaceAll("\\\"", "\\\\\\\""));
}

所以,如果你想写",你需要逃避正则表达式 - > \"但是因为你在java中,你需要转义java的\",所以你得到\\\\"。 (即搜索参数)。

对于您想要\" - >的替换参数在正则表达式:\\\" - >在Java \\\\\\\"

答案 3 :(得分:1)

s=s.replaceAll("\"","\\\\\"");

但是你应该像其他人一样replace(...)建议。

答案 4 :(得分:1)

使用;

s=s.replaceAll("\"","\\\\\"");

答案 5 :(得分:1)

String str = "'Foo \"Bar\" Bar'";
System.out.println(str);        
System.out.println(str.replaceAll("\"", "\\\\\""));

答案 6 :(得分:0)

请按照以下程序使用> s.replace(“/"."//");

public class stringbackslash {

    /**
     * @param args
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        String s="\";
        s=s.replace("\", "\\");
        System.out.println(s);

    }

}