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\\ 转义一个反斜杠,表示正则表达式输入将作为

我的理解是,每个反斜杠都需要为regex转义一个以上的反斜杠。我有以下Java输入字符串:

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

为了删除所有类\\,我在Java
replaceAll()
方法中添加了以下正则表达式:

*\\\b(类)(\\\\W\\\\S\\\\\/){1,2}\\\\b

为什么我添加了四个斜杠

  • 转义一个反斜杠,表示这是regex
    \\

  • 转义一个反斜杠,表示正则表达式输入将作为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将其显示为字符串时,它才会转义转义字符
    \
    ,并显示双
    \
    。如果您要检查它包含的字符,则每两个路径组件之间只有一个
    '\'

    对于字符串和转义,您应该真正显示实际代码,即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发布了实际代码