2017-10-09 113 views
0

我的理解是每个反斜杠都需要一个更多的反斜杠才能被正则表达式转义。我在Java中的下列输入字符串:Java实际上是否逃避反斜杠如何声称?

C:\\my\\drive\\application\\webapps\\ROOT\\classes\\there\\is\\a\\clazz

删除所有字符都classes\\,我添加了以下的正则表达式中的Java replaceAll()方法:

.*\\\\b(classes)(\\\\W\\\\S|\\\\/){1,2}\\\\b

为什么我添加了四条斜杠

  1. 一个反斜线以表明这是正则表达式\\

  2. 一个反斜线,表明正则表达式输入将会为Java String \\

但即使有一组双反斜杠\\它不起作用。

当我在regexr和regexplanet上尝试它时,它似乎对文件路径的unix/windows类型都正常工作,并给了我想要的东西。它向我展示了正确的replaceAll()结果。

但是当我把它放到代码中时,它根本不工作。

实际代码

String targetStr = someMethod.get(); // value is C:\\my\\drive\\application\\webapps\\ROOT\\classes\\there\\is\\a\\clazz 

String replacedVal = targetStr.replaceAll(".*\\\\b(classes)(\\\\W\\\\S|\\\\/){1,2}\\\\b", ""); 

System.out.println(targetStr); 
System.out.println(replacedVal); // same as targetStr i.e. nothing has been replaced 

我们那么有多少次在Java中需要真正的逃避每个反斜线得到这个工作?

+0

还有一个正则表达式,如果它们是字符串文字,那么这两个对于编译器就需要两个以上。 – EJP

+0

@EJP已经尝试过。没有工作。我不确定问题描述是否清晰,因为人们在没有意识到问题出在哪里的情况下下了决心。 – ha9u63ar

+1

看起来你可以通过使用'Path'类来轻松避免RegExp混淆... –

回答

2

在字符串的情况下并且逃脱你应该表现出你的实际代码,MCVE,不解释你的代码。正则表达式中的特殊字符:一个反斜杠,正则表达式中的实际反斜杠:两个反斜杠,正则表达式中两个实际反斜杠:四个反斜杠。正则表达式在java字符串中:加倍所有反斜杠。

因此,一个文字反斜杠意味着两个反斜杠来表示它在一个字符串中,意味着4个反斜杠来表示一个正则表达式字符串。像\w这样的所有“常规”特殊字符的正则表达式在java字符串中都需要两个反斜杠 - >"\\w"

看起来你的数值恰好是你在正则表达式中应该有的\的两倍。只有当你有一个正则表达式字符串并且想要匹配一个文字\时,四个反斜杠才是正确的。


注:关于你的代码:你写的:

String targetStr = someMethod.get(); // value is C:\\my\\drive\\application\\webapps\\ROOT\\classes\\there\\is\\a\\clazz 

但是,这并不完全正确,该值是

C:\my\drive\application\webapps\ROOT\classes\there\is\a\clazz 

只是因为你的IDE显示它作为一个字符串,它避开转义字符\并显示双重\\。如果要检查它的字符,则每两个路径组件之间只有一个'\'