【问题标题】:How to represent backslash如何表示反斜杠
【发布时间】:2013-08-29 05:57:13
【问题描述】:

我想替换不在提供列表中的内容

[^-\\dA-Za-zÂÃâ`~!@#$%^&*()_+=[{]}:;<,>.?/ ]

我想在这个列表中包含反斜杠\,这样反斜杠就不会被替换。 如果我这样给予

.replaceAll("[^-\\dA-Za-zÂÃâ`~!@#$%^&*()_+=[{]}\\:;<,>.?/ ]","")

它没有像我预期的那样工作。

"xyda\asff"..replaceAll("[^-\\dA-Za-zÂÃâ`~!@#$%^&*()_+=[{]}\\:;<,>.?/ ]","")

Expected result :: xyda\asff
Output :: xydaasff

我不想替换\

【问题讨论】:

    标签: java regex


    【解决方案1】:

    您需要应用 两个 级别的转义 - 一个用于正则表达式本身,一个用于 Java 字符串文字。这意味着您需要连续 四个 反斜杠。所以:

    replaceAll("[^-\\dA-Za-zÂÃâ`~!@#$%^&*()_+=[{]}\\:;<,>.?/\\\\ ]", "")
    

    我认为\\d 是为了覆盖任何数字,而不是实际上d 放在列表中?

    您可能会发现将您的模式打印到控制台最容易,这样您就可以准确地看到正则表达式引擎看到的内容,而无需相关的 Java 字符串文字转义。上面的模式是:

    [^-\dA-Za-zÂÃâ`~!@#$%^&*()_+=[{]}\:;<,>.?/\\ ]
    

    所以带反斜杠的位是:

    • \d(数字)
    • \:(冒号)
    • \\(反斜杠)

    【讨论】:

      【解决方案2】:

      要在正则表达式中编码单个文字反斜杠,您需要在代码中使用 四个 反斜杠 (\\\\)(请参阅最后一个字符):

      [^-\\dA-Za-zÂÃâ`~!@#$%^&*()_+=[{]}:;<,>.?/ \\\\]
      

      每对反斜杠是字符串中的一个反斜杠,您需要其中的两个,以便在正则表达式中进一步转义;你需要逃脱。


      我们能否摆脱这种在 Java 中令人眼花缭乱的编码? (努力寻找双关语)

      【讨论】:

      • 如果您只是在开头添加这额外的“一对反斜杠”,您将丢失 '\d'(数字)。所以数字也会被替换......
      • @Sambuca 哎呀!有罪:我浏览了正则表达式:/。现在修好了。谢谢
      【解决方案3】:

      您需要使用另一个斜线来转义斜线。所以\变成\\

      对于正则表达式,我认为您需要再次对其进行转义...

      .replaceAll("[^-\\dA-Za-zÂÃâ~!@#$%^&*()_+=[{]}\\:;<,>.?/ ]","")
                      ^^                            ^^
      

      如果您还需要包含 \ 斜杠,则需要像 \\\\ 一样对其进行转义

      【讨论】:

        【解决方案4】:

        要在代码中作为字符串文字提供的 java 正则表达式中使用文字反斜杠,您需要四个反斜杠。

        \\\\

        这是因为您希望 \\ 出现在实际的正则表达式中,但编译器还将 \ 视为字符串文字的转义,因此您需要再次转义每个字符串以使其通过实际字符串运行时!

        【讨论】:

          猜你喜欢
          • 2011-09-06
          • 2014-09-09
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2010-12-14
          相关资源
          最近更新 更多