假设我有一个如下字符串:
String param = "[\"\\n\",\"\\t\",\"'\",\"\\\"\",\"\\\\\"]"
System.out.println的输出是:
"\n","\t","'","\"","\\"
我想替换前面没有反斜杠的双引号,换句话说,我想要像下面那样输出System.out.println:
\n,\t,',\",\\
所以我使用了这种模式:
System.out.println(param.replaceAll("\\\\{0}\"", ""));
但我得到了这个:
\n,\t,',\,\\
如您所见,前面有反斜杠的双引号也会被替换。 如何防止它被替换?
编辑:抱歉方括号。您可以忽略它们,因为它们与此问题无关
答案 0 :(得分:1)
您需要将反斜杠与负面后卫匹配。
负面的背后观察是这样的:
(?<!X)Y
只有在模式Y
之前不存在模式X
时,才匹配模式Y
。
在您的情况下,X
是“反斜杠,前面没有反斜杠”,而Y
是"
。
这是你需要的正则表达式:
(?<![^\\]\\)"
Java代码:
System.out.println(param.replaceAll("(?<![^\\\\]\\\\)\"", ""));
顺便说一句,您似乎忘记删除前导和尾随方括号。
答案 1 :(得分:1)
使用此正则表达式:
"([^,]+)"
尝试此代码(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);
答案 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"));