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

时间:2017-10-14 08:28:47

标签: 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,',\,\\

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

编辑:抱歉方括号。您可以忽略它们,因为它们与此问题无关

4 个答案:

答案 0 :(得分:1)

您需要将反斜杠与负面后卫匹配。

负面的背后观察是这样的:

(?<!X)Y

只有在模式Y之前不存在模式X时,才匹配模式Y

在您的情况下,X是“反斜杠,前面没有反斜杠”,而Y"

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

(?<![^\\]\\)"

Java代码:

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

顺便说一句,您似乎忘记删除前导和尾随方括号。

答案 1 :(得分:1)

使用此正则表达式:

"([^,]+)"

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 = "$1";

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

答案 2 :(得分:1)

您可以使用以下正则表达式匹配并删除字符串文字限定符"

(?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,',\",\\,\\\"]

答案 3 :(得分:0)

只为你的代码使用它:

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

你的字符串:

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

所有项目都在双引号之间。所以第一个replaceAll将取代引号:

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

输出:

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

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

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