[英]Escape special characters in a text when text is either enclosed in double quotes or not
我正在写一个正则表达式来逃避一些特殊字符,包括输入的双引号。
输入可以用双引号括起来,那些不应该被转义。
输入结果:
"te(st", te(st, te"st
预期产出:
"te\(st", te\(st, te\"st
使用的代码:
String regex = "^\".*\"$";
String value = "\"strin'g\"";
Pattern SPECIAL_REGEX_CHARS = Pattern.compile("[()'"\\[\\]*]");
if (Pattern.matches(regex, value)){
String val = value.substring(1, value.length() -1);
String replaceAll = SPECIAL_REGEX_CHARS.matcher(val).replaceAll("\\\\$0");
replaceAll = "\""+replaceAll+"\"";
System.out.println(replaceAll);
}else {
String replaceAll = SPECIAL_REGEX_CHARS.matcher(value).replaceAll("\\\\$0");
System.out.println(replaceAll);
}
1 - 检查文本是否用双引号括起来。 如果是,则转义用双引号括起来的文本中的特殊字符。
2 - 别的。 转义文本中的特殊字符。
任何可以组合#1和#2的正则表达式?
此致,Anil
您可以使用if (s.startsWith("\\"") && s.endsWith("\\""))
来检查字符串是否同时包含前导和尾随"
,如果是,则可以删除前导并跟踪"
with replaceAll("^\\"|\\"$", "")
,然后使用转义正则表达式转义,然后添加"
返回。否则,只需转义集合中的字符。
String SPECIAL_REGEX_CHARS = "[()'\"\\[\\]*]";
String s = "\"te(st\""; // => "te\(st"
String result;
if (s.startsWith("\"") && s.endsWith("\"")) {
result = "\"" + s.replaceAll("^\"|\"$", "").replaceAll(SPECIAL_REGEX_CHARS, "\\\\$0") + "\"";
}
else {
result = s.replaceAll(SPECIAL_REGEX_CHARS, "\\\\$0");
}
System.out.println(result.toString());
请参阅另一个IDEONE演示
appendReplacement
“回调”的替代解决方案 以下是使用替换的一个正则表达式的方法:
String SPECIAL_REGEX_CHARS = "[()'\"\\[\\]*]";
//String s = "\"te(st\""; // => "te\(st"
//String s = "te(st"; // => te\(st
String s = "te\"st"; // => te\"st
StringBuffer result = new StringBuffer();
Matcher m = Pattern.compile("(?s)\"(.*)\"|(.*)").matcher(s);
if (m.matches()) {
if (m.group(1) == null) { // we have no quotes around
m.appendReplacement(result, m.group(2).replaceAll(SPECIAL_REGEX_CHARS, "\\\\\\\\$0"));
}
else {
m.appendReplacement(result, "\"" + m.group(1).replaceAll(SPECIAL_REGEX_CHARS, "\\\\\\\\$0") + "\"");
}
}
m.appendTail(result);
System.out.println(result.toString());
请参阅IDEONE演示
要点:
Matcher#addReplacement()
与Matcher#appendTail()
允许操作组。 (?s)\\"(.*)\\"|(.*)
:2个选择分支正则表达式".*"
匹配的字符串开头"
和结尾"
(注意, (?s)
是一个DOTALL在线修改允许匹配字符串与换行符序列)或.*
替代匹配所有其他字符串。 "
两端”。 \\\\\\\\\\\\\\\\
。 你可以使用负面的lookbehind和lookahead :
System.out.println(value.replaceAll("([()'\\[\\]*]|(?<!^)\"(?!$))", "\\\\$0"));
这基本上是说:在字符类[()'\\[\\]*]
转义任何内容,或者"
不以字符串开头或后跟字符串结尾的任何内容"
。
唯一的问题是,无论在另一端是否有相应的报价,都会忽略前导和尾随报价。 如果这是一个问题,您可以链接这些替换以逃避不匹配的前导或尾随引用:
.replaceAll("^\".*[^\"]$", "\\\\$0")
.replaceAll("(^[^\"].*)(\"$)", "$1\\\\$2")
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.