java - 如何在前面没有反斜杠的情况下替换所有双引号

标签 java regex double-quotes

假设我有如下字符串:

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/

相关文章:

python - 将 1 添加到与字符串中特定正则表达式匹配的数字

r - 使用正则表达式查找匹配项,然后仅删除匹配表达式中的第一个字符

csv - hive sql,serde如何不引用我的字段?

python - 子进程中单引号和双引号之间的区别[Python 3.4]

java - 自定义 AppenderBase 未被调用

javascript - 如何将文本拆分为 URL 数组和空格分隔的短语?

java - 在 Amazon Web Services 上运行 Web 应用程序时查看控制台输出

Javascript(正则表达式): How do i replace (Backslash + Double Quote) pairs?

java - 去除插入排序中的重复项

java - jpa mysql表不存在