Java 当文本是否包含在双引号中时,对文本中的特殊字符进行转义
我正在编写一个正则表达式来转义输入中的一些特殊字符,包括双引号 输入可以用双引号括起来,不应转义 输入的Ex:Java 当文本是否包含在双引号中时,对文本中的特殊字符进行转义,java,regex,Java,Regex,我正在编写一个正则表达式来转义输入中的一些特殊字符,包括双引号 输入可以用双引号括起来,不应转义 输入的Ex: "te(st", te(st, te"st 预期产出: "te\(st", te\(st, te\"st 使用的代码: String regex = "^\".*\"$"; String value = "\"strin'g\""; Pattern SPECIAL_REGEX_CHARS = Pattern.compile("[()'"\\[\\]*]");
"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(“\”)
检查字符串是否同时具有前导和尾随”
,如果有,则可以使用replaceAll(“^\”\124;\“$”,“)
修剪前导和尾随,然后使用转义正则表达式进行转义,然后添加“
返回。否则,只需转义集合中的角色
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());
看另一个
带有附件替换的替代解决方案
“回调”
下面是我如何使用一个交替的正则表达式:
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());
看
要点:
- 具有允许操纵组的
- 使用带有两个可选分支的
(?s)\“(.*)\”(.*)
正则表达式:“*”
匹配以“
开头并以”
结尾的字符串(请注意,(?s)
是一个DOTALL内联修饰符,允许将字符串与换行序列匹配)或一个仅匹配所有其他字符串的*
可选
- 如果第一个选项匹配,我们只需替换第一个捕获组中选定的特殊字符,然后在两端添加
“
- 如果第二个选项匹配,只需在整个组2中添加转义符号
- 要替换为文字反斜杠,您需要替换模式中的
您可以使用:
这可以通过使用1个正则表达式的代码来完成。尽管如此,它仍需要一些额外的代码行。第三行代码无法编译。请使用条件正则表达式共享正则表达式,好吗?我想试试更好的方法。不确定我的方法是否是标准方法。请尝试特殊模式\u正则表达式\u CHARS=Pattern.compile(“[()\”'\[\]*]);难道你不想被转义吗?你知道,“简化”对于不同的人可能意味着不同的事情:)考虑到你的需求,我认为这已经很简单了。如果有什么不清楚的地方,请询问。我添加了一个使用最小正则表达式的“更简单”解决方案。环顾法的问题是,这样就无法检查输入是否在字符串的开头和结尾都有“
。@AnilDasari,我得到”\(te\“st”
。你还期待什么吗?@WiktorStribiżew这取决于他对检查匹配引号的重视程度。据我所知,此输入可能不可能有不匹配的引号。好吧,无论如何,我相信检查字符串是否以双引号开头或结尾,我们并不真正需要正则表达式。
System.out.println(value.replaceAll("([()'\\[\\]*]|(?<!^)\"(?!$))", "\\\\$0"));
.replaceAll("^\".*[^\"]$", "\\\\$0")
.replaceAll("(^[^\"].*)(\"$)", "$1\\\\$2")