Tag: escaping

为什么java中的String.replaceAll()需要在正则表达式中使用4个斜杠“\\\\”来实际替换“\”?

我最近注意到,当涉及转义字符“\”(斜杠)时,String.replaceAll(正则表达式,替换)表现得非常奇怪。 例如,考虑有一个带有filepath的字符串 – String text = “E:\\dummypath” ,我们想用”/”替换”\\” “/” 。 text.replace(“\\”,”/”)给出输出”E:/dummypath” text.replaceAll(“\\”,”/”)而text.replaceAll(“\\”,”/”)引发exceptionjava.util.regex.PatternSyntaxException 。 如果我们想用replaceAll()实现相同的function,我们需要将其写为text.replaceAll(“\\\\”,”/”) 一个值得注意的区别是replaceAll()将其参数作为reg-ex,而replace()具有参数character-sequence! 但text.replaceAll(“\n”,”/”)与其char序列等效text.replace(“\n”,”/”)完全相同 深入挖掘:当我们尝试其他一些输入时,可以观察到更奇怪的行为。 让我们分配text=”Hello\nWorld\n” 现在, text.replaceAll(“\n”,”/”) , text.replaceAll(“\\n”,”/”) , text.replaceAll(“\\\n”,”/”)所有这三个给出相同的输出Hello/World/ Java以我认为最好的方式真的搞砸了reg-ex! 没有其他语言似乎在reg-ex中有这些有趣的行为。 有什么特别的原因,为什么Java搞砸了这样?