Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/324.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 当文本是否包含在双引号中时,对文本中的特殊字符进行转义_Java_Regex - Fatal编程技术网

Java 当文本是否包含在双引号中时,对文本中的特殊字符进行转义

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("[()'"\\[\\]*]");

我正在编写一个正则表达式来转义输入中的一些特殊字符,包括双引号

输入可以用双引号括起来,不应转义

输入的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("[()'"\\[\\]*]");

    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")