我的理解是,每个反斜杠都需要为正则表达式转义一个反斜杠。我在Java中有以下输入字符串:
C:\\my\\drive\\application\\webapps\\ROOT\\classes\\there\\is\\a\\clazz
删除classes\\
以外的所有内容,我在Java replaceAll()
方法中添加了以下正则表达式:
.*\\\\b(classes)(\\\\W\\\\S|\\\\/){1,2}\\\\b
为什么我添加了四个斜杠
一个反斜杠转义为表明这是正则表达式\\
一个反斜杠转义为表明正则表达式输入是作为java字符串\\
。
但即使使用一组双反斜杠\\
,它也无法正常工作。
当我在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 :(得分:2)
在字符串和转义符的情况下,你应该真正显示你的实际代码,一个MCVE,而不是解释你的代码。正则表达式中的特殊字符:一个反斜杠,正则表达式中的实际反斜杠:两个反斜杠,正则表达式中的两个实际反斜杠:四个反斜杠。 java字符串中的正则表达式:双倍所有反斜杠。
因此,一个文字反斜杠意味着在String中表示它的两个反斜杠,意味着在正则表达式String中表示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将其显示为String,它才会转义转义字符\
并显示双\\
。如果要检查它所具有的字符,则每两个路径组件之间只有一个'\'
。