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

How to replace all double quotes without a backslash ahead

假设我有如下字符串:

String param = "[\"\n\",\"\t\",\"'\",\"\\"\",\"\\\"]"

System.out.println的输出是:

"\n","\t","'","\"","\"

我想替换前面没有反斜杠的双引号,或者换句话说,我想 System.out.println 输出如下所示:

\n,\t,',\",\

所以我使用了这个模式:

System.out.println(param.replaceAll("\\{0}\"", ""));

但我得到了这个:

\n,\t,',\,\

如您所见,前面带反斜杠的双引号也被替换了。 如何防止它被替换?

编辑:对方括号感到抱歉。你可以忽略它们因为它们与这个问题无关

您需要将反斜杠与负向后视相匹配。

负面回顾看起来像这样:

(?<!X)Y

仅当模式 X 在模式 Y.

之前不存在时才会匹配模式 Y

在您的情况下,X 是 "a back slash without a backslash in front",Y"

这是您需要的正则表达式:

(?<![^\]\)"

Java代码:

System.out.println(param.replaceAll("(?<![^\\]\\)\"", ""));

顺便说一下,您似乎忘记删除前后方括号。

使用这个正则表达式:

"([^,]+)"

Click for Demo

试试这个代码(Generated):

import java.util.regex.Matcher;
import java.util.regex.Pattern;

final String regex = "\"([^,]+)\"";
final String string = "[\"\n\",\"\t\",\"'\",\"\\"\",\"\\\"]";
final String subst = "";

final Pattern pattern = Pattern.compile(regex);
final Matcher matcher = pattern.matcher(string);

// The substituted value will be contained in the result variable
final String result = matcher.replaceAll(subst);

System.out.println("Substitution result: " + result);

Execute and See the Output here

仅将其用于您的代码:

System.out.println(param.replaceAll("\"(.)\"", "").replaceAll("\[\"(.*)\"\]", ""));

你的字符串:

String param = "[\"\n\",\"\t\",\"'\",\"\\"\",\"\\\"]";

所有项目都用双引号括起来。所以第一个 replaceAll 将替换引号 :

System.out.println(param.replaceAll("\"(.)\"", ""));

输出:

["\n,\t,',\",\"]

清理字符串的开头和结尾:

System.out.println(param.replaceAll("\"(.)\"", "").replaceAll("\[\"(.*)\"\]", ""));

您可以使用以下正则表达式来匹配和删除作为字符串文字限定符的 "

(?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, "");
System.out.println(param);
// => [\n,\t,',\",\,\\"]