java - Java 真的如其声称的那样转义了反斜杠吗?

标签 java regex

我的理解是,每个反斜杠都需要再为正则表达式转义一个反斜杠。我在 Java 中有以下输入字符串:

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

为了删除 classes\\ 之前的所有内容,我在 Java replaceAll() 方法中添加了以下正则表达式:

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

为什么我添加了四个斜杠

  1. 一个反斜杠转义以表明这是正则表达式 \\

  2. 一个反斜杠转义以指示正则表达式输入将作为 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/

相关文章:

javascript - 如何使用正则表达式查找javascript变量的值?

java - 哪些 AtomicInteger 方法是测试和设置、获取和添加以及比较和交换(就无锁算法而言)?

匹配一个不包含单词 'test' 的句子的正则表达式

regex - 在正则表达式匹配中检测标量的精确字符串值

java - 如何在另一个 Activity 的 GraphView 中将 SQLite 数据库中的日期显示为 X 轴,仅显示 1-1-1970?

c# - 正则表达式 - 如果开始匹配则匹配结束

java - 如何在java中删除单词模式后的逗号

java - 在 Jruby 中显式重写 Java 方法?

java - 将 MySQL 查询转换为 JPA 来获取计数

java - 如何使用 JAX-WS 从 Web 服务访问 DAO