【问题标题】:Add escape "\" in front of special character for a string在字符串的特殊字符前添加转义“\”
【发布时间】:2015-12-06 12:53:31
【问题描述】:

我有一个简单的 SQL 查询,我在其中检查查询是否与我拥有的任何字段匹配。我为此使用 LIKE 语句。我的一个字段可以有特殊字符,搜索查询也是如此。所以我正在寻找一个解决方案,我需要在特殊字符前转义“\”。

query = "hello+Search}query"

我需要把上面的改成

query = "hello\+Search\}query"

除了单独搜索每个特殊字符并添加“\”之外,还有其他简单的方法吗?因为如果我没有转义字符,我会收到错误消息

java.util.regex.PatternSyntaxException: Dangling meta character '+' near index 0

提前致谢

【问题讨论】:

  • 你在什么环境下使用它?为什么在正则表达式中使用它?您能否显示发生该错误的上下文(请编辑问题)。
  • 另外请添加您正在使用的数据库。

标签: java string special-characters


【解决方案1】:

决定要转义的特殊字符,然后调用

query.replace("}", "\\}")

您可以将所有允许的特殊字符保留在某个数组中,然后对其进行迭代并替换出现的示例。 此方法替换所有regex meta characters

public String escapeMetaCharacters(String inputString){
    final String[] metaCharacters = {"\\","^","$","{","}","[","]","(",")",".","*","+","?","|","<",">","-","&","%"};

    for (int i = 0 ; i < metaCharacters.length ; i++){
        if(inputString.contains(metaCharacters[i])){
            inputString = inputString.replace(metaCharacters[i],"\\"+metaCharacters[i]);
        }
    }
    return inputString;
}

您可以将其用作query=escapeMetaCharacters(query); 不要以为你会找到的任何图书馆会做更多的事情。充其量它定义了一个完整的特殊字符列表。

【讨论】:

  • OP 说“除了单独搜索每个特殊字符并添加\”。
  • 确实如此,但没有更好的选择。我建议他只跟踪他逃脱的所有特殊字符。
  • 您需要将 outputString 初始化为 inputString 而不是空字符串,以防不存在特殊字符
  • 在 2018 年的 Java 中仍然需要这种解决方法 :(
【解决方案2】:

您需要使用\\\ 引入字符串文字;那就是你需要转义\。 (单个反斜杠用于将特殊字符引入字符串:例如,\t 是一个制表符。)

query = "hello\\+Search\\}query" 是您所需要的。

【讨论】:

  • 好的,但无论哪种方式,我都需要一种方法来识别特殊字符(例如“+”)的位置,这样我就可以添加该值。我的查询看起来像这样“hello+Search}query” 我需要找到特殊字符的位置来添加转义字符。
  • 只需将+替换为\\+
  • 或者使用准备好的语句。它还应该能够处理这些特殊字符。
  • 我需要一个通用方法来识别查询中的所有特殊字符,“+”就是一个例子。所以我一直在寻找一种比寻找每个特殊字符并替换它更优雅的解决方案。
  • @Tom:我同意。遗憾的是,OP 没有指定数据库。
【解决方案3】:

我必须在 javascript 中做同样的事情。我想出了以下解决方案。我认为这可能对某人有所帮助。

function escapeSpecialCharacters(s){
 let arr = s.split('');
 arr = arr.map(function(d){
         return d.replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\'+d)
       });
 let reg = new RegExp(arr.join('')); 
 return reg;
}

let newstring = escapeSpecialCharacters("hello+Search}query");

【讨论】:

    【解决方案4】:

    实际上有一种更好的方法可以以一种时尚的方式做到这一点。

    String REGEX = "[\\[+\\]+:{}^~?\\\\/()><=\"!]";
    
    StringUtils.replaceAll(inputString, REGEX, "\\\\$0");
    

    【讨论】:

      【解决方案5】:

      如果您想使用 Java 8+ 和 Streams,您可以执行以下操作:

      private String escapeSpecialCharacters(String input) {
          List<String> specialCharacters = Lists.newArrayList("\\","^","$","{","}","[","]","(",")",".","*","+","?","|","<",">","-","&","%");
          return Arrays.stream(input.split("")).map((c) -> {
                      if (specialCharacters.contains(c)) return "\\" + c;
                      else return c;
          }).collect(Collectors.joining());
      }
      

      【讨论】:

        猜你喜欢
        • 2012-11-21
        • 2011-05-11
        • 2011-05-07
        • 1970-01-01
        • 2017-12-01
        • 1970-01-01
        • 2017-09-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多