2012-08-02 190 views
17

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

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

我需要替换所有\"",所以结果看起来像:

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

这一个不工作:str.replaceAll("\\\"", "\""),因为它只匹配报价。不确定如何绕过反斜杠。我可以先删除反斜杠,但我的字符串中还有其他反斜杠。

+0

在第一个参数中需要更多反斜杠。这看起来有点反直觉,但如果你想一想,这将是有道理的。 – 2012-08-02 00:45:07

+2

要在正则表达式中编写一个文字\,使用'“\\\\”'第一个“double up”是为了避免字符串* literal *中的斜杠(因此结果字符串* value *是\\\)。然后,第一个斜杠转义为正则表达式引擎中的第二个*,以便匹配一个\字符。好玩,呃? – 2012-08-02 00:50:32

+1

听起来就像您试图解码可能包含转义序列的字符串,其中反斜杠是转义字符。当输入包含反斜杠 - 引号时,解码器的输出应该是什么?确保你为这种情况编写测试。 – dnault 2012-08-02 02:04:24

回答

47

如果您要更换文字和不需要正则表达式的语法,而不是replaceAll使用replace

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

这两种方法将取代所有出现的目标,但replace将逐字治疗目标。


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

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

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

但创建表示\\字符串,所以你可能在你需要把它写四个\"\\\\")将它传递给正则表达式引擎,因为\也是字符串(它可以被用来例如作为\t代表制表特殊字符),所以你也需要在那里跳出\

换句话说,你需要逃跑\两次:

  • 曾经在正则表达式\\
  • ,一次在字符串"\\\\"
+0

哦,我的...明白了。虽然有趣。万分感谢。 – Simo 2012-08-02 01:54:06

6

你并不需要一个正则表达式。

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

应该工作得很好。

replace方法需要两个子字符串并将第一个和第二个的所有非重叠事件替换掉。每javadoc

public String replace(CharSequence target, 
         CharSequence replacement) 

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

0

试试这个:str.replaceAll("\\\\\"", "\\\"")
因为Java将取代\两次:

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

相关问题