假设我有如下字符串:
String param = "[\"\\n\",\"\\t\",\"'\",\"\\\"\",\"\\\\\"]"
System.out.println 的输出是:
"\n","\t","'","\"","\\"
我想替换前面没有反斜杠的双引号,或者换句话说,我希望 System.out.println 输出如下所示:
\n,\t,',\",\\
所以我使用了这个模式:
System.out.println(param.replaceAll("\\\\{0}\"", ""));
但是我得到了这个:
\n,\t,',\,\\
如您所见,前面带有反斜杠的双引号也被替换了。 如何防止它被替换?
编辑:对方括号感到抱歉。你可以忽略它们,因为它们与这个问题无关
最佳答案
您可以使用以下正则表达式来匹配和删除"
是字符串文字限定符:
(?s)(?<!\\)((?:\\{2})*)"([^"\\]*(?:\\.[^"\\]*)*)"
参见 regex demo .
详情
-
(?s)
- DOTALL 修饰符(以防万一字符串文字可以跨行) -
(?<!\\)
- 没有\
紧靠当前位置的左侧 -
((?:\\{2})*)
- 第 1 组:任何 0+ 个连续出现的 2 个反斜杠 -
"
- 双引号(字符串文字开始) -
([^"\\]*(?:\\.[^"\\]*)*)
- 第 2 组:-
[^"\\]*
- 除\
以外的任何 0+ 个字符和"
-
(?:\\.[^"\\]*)*
- 0+序列-
\\.
- 一个\
后跟任何字符 -
[^"\\]*
- 除\
以外的任何 0+ 个字符和"
-
-
-
"
- 结束字符串文字双引号
参见 Java demo :
String param = "[\"\\n\",\"\\t\",\"'\",\"\\\"\",\"\\\\\",\"\\\\\\\"\"]";
System.out.println(param);
// => ["\n","\t","'","\"","\\","\\\""]
String regex = "(?s)(?<!\\\\)((?:\\\\{2})*)\"([^\"\\\\]*(?:\\\\.[^\"\\\\]*)*)\"";
param = param.replaceAll(regex, "$1$2");
System.out.println(param);
// => [\n,\t,',\",\\,\\\"]
关于java - 如何在前面没有反斜杠的情况下替换所有双引号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46742494/