在Java正则expression式中正斜杠

我不明白为什么下面的代码没有按预期的行为

"Hello/You/There".replaceAll("/", "\\/"); 
  • 预期输出: Hello\/You\/There
  • 实际产出: Hello/You/There

我需要逃避正斜杠吗? 我不这么认为,但我也尝试了以下违反我的意愿…没有工作

 "Hello/You/There".replaceAll("\\/", "\\/"); 

最后,我意识到我不需要一个正则expression式,我只能使用下面的,它不会创build一个正则expression式

 "Hello/You/There".replace("/", "\\/"); 

但是,我仍然想明白为什么我的第一个例子不起作用。

问题实际上是你需要在replacestring中双重转义反斜杠 。 你看, "\\/" (我敢肯定你知道)意味着replacestring是\/ ,而且(因为你可能不知道)replacestring\/实际上只是插入/ ,因为Java很奇怪,并给replacestring赋予一个特殊的含义。 (据推测, \$将是一个字面的美元符号,但我认为真正的原因是他们想要与人混淆,其他语言不这样做)所以你必须写:

 "Hello/You/There".replaceAll("/", "\\\\/"); 

要么:

 "Hello/You/There".replaceAll("/", Matcher.quoteReplacement("\\/")); 

(使用java.util.regex.Matcher.quoteReplacement(String) 。)

呈现为string时需要双重转义。

每当我做一个新的正则expression式时,我会用在线工具做一堆testing,例如: http : //www.regexplanet.com/advanced/java/index.html

那个网站允许你input正则expression式,然后你可以根据不同的input对它进行testing。

实际上,为什么所有这些都搞砸了呢? 在这个线程中进一步挖掘更深一层,可能有助于理解“\\”为什么performance如此。