【问题标题】:Escape Java RegExp Metacharacters转义 Java RegEx 元字符
【发布时间】:2012-06-14 21:32:24
【问题描述】:

我试图在 Java 中转义 RegExp 元字符。以下是我想要的:

INPUT STRING: "This is $ test"
OUTPUT STRING: "This is \$ test"

这是我目前正在做的,但它不起作用:

String inputStr= "This is $ test";
inputStr = inputStr.replaceAll("$","\\$");

但我得到了错误的输出:

"This is $ test$"

【问题讨论】:

  • 只需使用replace 代替replaceAll。它会起作用,而且会更有效率。

标签: java regex string escaping


【解决方案1】:

你需要:

inputStr.replaceAll("\\$", "\\\\\\$");

要替换的字符串需要 2 个反斜杠,因为 $ 在正则表达式中具有特殊含义。所以 $ 必须被转义,以获得:\$,并且反斜杠必须本身在 java 字符串中转义:"\\$"

替换字符串需要 6 个反斜杠,因为 \$ 在替换字符串中都有特殊含义:

  • \ 可用于转义替换字符串中的字符。
  • $ 可用于在替换字符串中进行反向引用。

因此,如果您的预期替换字符串是“\$”,您需要转义这两个字符中的每一个以获得:\\\$,然后您需要使用每个反斜杠 - 其中 3 个,1 个文字和 2 个用于转义- 必须在 java 字符串中进行转义:"\\\\\\$"

见:Matcher.replaceAll

【讨论】:

    【解决方案2】:

    正如您所说,$ 是正则表达式的保留字符。然后,你需要逃避它。您可以使用反斜杠字符来执行此操作:

    inputStr.replaceAll("\\$", ...);
    

    在替换中,$和\字符也有特殊含义:

    请注意,替换字符串中的反斜杠 () 和美元符号 ($) 可能会导致结果与将其视为文字替换字符串时的结果不同;见 Matcher.replaceAll

    然后,替换将是反斜杠字符和美元符号,它们都被“\”字符转义(为了构建字符串,需要将其加倍):

    inputStr.replaceAll("\\$", "\\\\\\$");
    

    【讨论】:

      【解决方案3】:

      你必须放 6 个反斜杠,这样你才能避开反斜杠和元字符:

      inputStr.replaceAll("\\$","\\\\\\$");

      【讨论】:

        【解决方案4】:

        replaceAll 的第一个参数实际上是一个正则表达式,而 $ 实际上意味着“匹配字符串的结尾”。在这种情况下,您可以只使用替换,它不使用正则表达式,只是一个普通的字符串替换,来实现您想要的。如果您想使用正则表达式,只需将第一个参数中的 $ 转义即可。

        【讨论】:

          猜你喜欢
          • 2017-01-24
          • 2021-10-18
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多