我正在编写一个正则表达式来转义一些特殊字符,包括输入中的双引号。
输入可以用双引号括起来,双引号不能转义。
输入示例:
"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 的正则表达式?
问候, 阿尼尔
最佳答案
仅使用一个转义正则表达式的简单解决方案
您可以使用 if (s.startsWith("\"") && s.endsWith("\""))
来检查字符串是否同时具有前导和尾随 "
,如果是,则可以使用 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 demo
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 demo
要点:
Matcher#addReplacement()
与Matcher#appendTail()
允许操纵组。- 使用
(?s)\"(.*)\"|(.*)
正则表达式和 2 个替代分支:".*"
匹配以开头的字符串"
并以"
结尾(请注意(?s)
是一个 DOTALL 内联修饰符,允许使用换行符序列匹配字符串)或.*
仅匹配所有其他字符串的替代方法。 - 如果匹配到第一个选项,我们只替换第一个捕获组中选定的特殊字符,然后在两端添加
"
。 - 如果匹配到第二个备选方案,则只需在整个组 2 中添加转义符号即可。
- 要用文字反斜杠替换,您需要在替换模式中使用
\\\\\\\\
。
关于java - 当文本是否包含在双引号中时转义文本中的特殊字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35405532/