如何在前面没有反斜杠的情况下替换所有双引号
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("(?<![^\\]\\)\"", ""));
顺便说一下,您似乎忘记删除前后方括号。
使用这个正则表达式:
"([^,]+)"
试试这个代码(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);
仅将其用于您的代码:
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,',\",\,\\"]
假设我有如下字符串:
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("(?<![^\\]\\)\"", ""));
顺便说一下,您似乎忘记删除前后方括号。
使用这个正则表达式:
"([^,]+)"
试试这个代码(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);
仅将其用于您的代码:
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,',\",\,\\"]