我的理解是,每个反斜杠都需要再为正则表达式转义一个反斜杠。我在 Java 中有以下输入字符串:
C:\\my\\drive\\application\\webapps\\ROOT\\classes\\there\\is\\a\\clazz
为了删除 classes\\
之前的所有内容,我在 Java replaceAll()
方法中添加了以下正则表达式:
.*\\\\b(类)(\\\\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 中,我们需要多少次实际转义每个反斜杠才能使其正常工作?
最佳答案
在字符串和转义的情况下,您应该真正显示您的实际代码(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 将其显示为字符串,它才会转义转义字符 \
并显示双 \\
。如果您检查它的字符,每两个路径组件之间只有一个 '\'
。
关于java - Java 真的如其声称的那样转义了反斜杠吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46644134/