Java是否真的逃脱了它的主张如何?

时间:2017-10-09 10:19:55

标签: java regex

我的理解是,每个反斜杠都需要为正则表达式转义一个反斜杠。我在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字符串\\

  3. 但即使使用一组双反斜杠\\,它也无法正常工作。

    当我在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中我们需要多少次才能实际转义每个反斜杠以使其工作?

1 个答案:

答案 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,它才会转义转义字符\并显示双\\。如果要检查它所具有的字符,则每两个路径组件之间只有一个'\'