在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如此。