【问题标题】:Regular expression to match a backslash followed by a quote正则表达式匹配反斜杠后跟引号
【发布时间】:2020-10-28 23:29:37
【问题描述】:

如何编写一个正则表达式来匹配这个\"(一个反斜杠然后一个引号)?假设我有一个这样的字符串:

<a href=\"google.com\"> click to search </a>

我需要用" 替换所有\",所以结果如下:

<a href="google.com"> click to search </a>

这个不起作用:str.replaceAll("\\\"", "\"") 因为它只匹配引用。不知道如何解决反斜杠。我可以先删除反斜杠,但我的字符串中还有其他反斜杠。

【问题讨论】:

  • 第一个参数中需要更多的反斜杠。这可能看起来有点违反直觉,但如果你仔细想想,它就会有道理。
  • 要在正则表达式中写入文字 \,请使用 "\\\\" 第一个“加倍”是转义字符串 literal 中的斜杠(因此生成的字符串 value 是 \\)。然后第一个斜杠转义第二个 in 正则表达式引擎,因此它将匹配一个 \ 字符。有趣,嗯?
  • 听起来您正在尝试解码可能包含转义序列的字符串,其中反斜杠是转义字符。当输入包含反斜杠反斜杠引号时,解码器的输出应该是什么?确保为这种情况编写测试。

标签: java regex


【解决方案1】:

如果您不需要任何正则表达式机制,例如预定义的字符类 \d、量词等。 而不是 replaceAll 期望正则表达式使用 replace需要文字

str = str.replace("\\\"","\"");

这两种方法都将替换所有个目标,但replace 将按字面意思对待目标。


但是如果你真的必须使用你正在寻找的正则表达式

str = str.replaceAll("\\\\\"", "\"")

\ 是正则表达式中的特殊字符(例如用于创建 \d - 表示数字的字符类)。要使正则表达式将\ 视为普通字符,您需要在它之前放置另一个\ 以关闭其特殊含义(您需要对其进行转义)。所以我们尝试创建的正则表达式是\\

但是要创建表示文本 \\ 的字符串文字,以便您可以将其传递给正则表达式引擎,您需要将其写为四个 \ ("\\\\"),因为 \ 也是字符串文字中的特殊字符(部分使用"..." 编写的代码),因为它可以用作例如\t 来表示制表符。 这就是为什么你还需要在那里转义\

简而言之,您需要两次转义\

  • 在正则表达式中\\
  • 然后在字符串文字"\\\\"

【讨论】:

    【解决方案2】:

    您不需要正则表达式。

    str.replace("\\\"", "\"")
    

    应该可以正常工作。

    replace 方法采用两个子字符串,并用第二个替换所有不重叠的第一个。根据javadoc

    public String replace(CharSequence target,
                          CharSequence replacement)
    

    用指定的文字替换序列替换此字符串中与文字目标序列匹配的每个子字符串。替换从字符串的开头一直进行到结尾,例如,将字符串"aaa"中的"aa"替换为"b"将导致"ba"而不是"ab"

    【讨论】:

      【解决方案3】:

      试试这个:str.replaceAll("\\\\\"", "\\\"")
      因为Java会替换\两次:

      (1) \\\\\" --> \\"(用于字符串)
      (2) \\" --> \"(用于正则表达式)

      【讨论】:

        猜你喜欢
        • 2012-07-30
        • 2020-12-04
        • 2016-12-13
        • 2019-08-26
        • 1970-01-01
        • 2023-03-13
        • 1970-01-01
        • 2017-05-07
        相关资源
        最近更新 更多