java - 当文本是否包含在双引号中时转义文本中的特殊字符

标签 java regex

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

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

输入示例:

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

相关文章:

java - 本类为两种不同产品 flavor

java - 从另一个文件夹导入java文件

python - NLTK RegexpParser,通过精确匹配一个项目来分块短语

java - 模式匹配删除 wiki 标记

javascript - 使用 Javascript 中的正则表达式验证输入

php - SQL从脏数据集创建新数据库

python regex xpath - 正则表达式 XPATH 的属性

java - 帮我解决打印时数组中的错误吗?

Java CachedThreadPool 与 FixedThreadPool

java - 流口水议程组锁定 Activity 似乎对我不起作用