Java真的能像它声称的那样摆脱反斜杠吗?
我的理解是,每个反斜杠都需要为regex转义一个以上的反斜杠。我有以下Java输入字符串:Java真的能像它声称的那样摆脱反斜杠吗?,java,regex,Java,Regex,我的理解是,每个反斜杠都需要为regex转义一个以上的反斜杠。我有以下Java输入字符串: C:\\my\\drive\\application\\webapps\\ROOT\\classes\\there\\is\\a\\clazz 为了删除所有类\\,我在JavareplaceAll()方法中添加了以下正则表达式: *\\\b(类)(\\\\W\\\\S\\\\\/){1,2}\\\\b 为什么我添加了四个斜杠 转义一个反斜杠,表示这是regex\\ 转义一个反斜杠,表示正则表达式输入将作为
C:\\my\\drive\\application\\webapps\\ROOT\\classes\\there\\is\\a\\clazz
为了删除所有类\\,我在JavareplaceAll()
方法中添加了以下正则表达式:
*\\\b(类)(\\\\W\\\\S\\\\\/){1,2}\\\\b
为什么我添加了四个斜杠
\\
\\
进行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将其显示为字符串时,它才会转义转义字符
\
,并显示双\
。如果您要检查它包含的字符,则每两个路径组件之间只有一个'\'
。对于字符串和转义,您应该真正显示实际代码,即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将其显示为字符串时,它才会转义转义字符
\
,并显示双\
。如果要检查它包含的字符,则每两个路径组件之间只有一个'\'
。对于regex还有一个,如果这两个是字符串文本,则编译器需要另外两个。@EJP已经尝试过了。没用。我不确定问题描述是否清楚,因为人们在投票时没有意识到问题是什么。看起来您可以通过使用Path
class轻松避免RegExp混淆…根据您的问题,您尝试了一个编译器,而不是两个。您肯定必须发布实际代码。@EJP为正则表达式多发布了一个实际代码,如果这两个代码是字符串文字,则编译器需要多发布两个。@EJP已经尝试过了。没用。我不确定问题描述是否清楚,因为人们在投票时没有意识到问题是什么。看起来您可以通过使用Path
class轻松避免RegExp混淆…根据您的问题,您尝试了一个编译器,而不是两个。您当然必须发布您的实际代码。@EJP发布了实际代码