【问题标题】:Replace special character with an escape preceded special character in Java在Java中用转义前的特殊字符替换特殊字符
【发布时间】:2012-11-21 16:45:59
【问题描述】:

在我的 java 代码中,如果字符串输入有任何提到的特殊字符,则应该在前面加上 \\

特殊字符集是{+, -, &&, ||, !, (, ), {, },[, ], ^, "", ~, *, ?, :, \}。我尝试使用String.replaceAll(old,new),但令我惊讶的是它不起作用,即使我为“旧”和“新”提供了正确的值。

if old=":",new="\:"

我将特殊字符放在一个字符串数组中,在 for 循环中对其进行迭代,检查它是否存在于字符串中,如果是,input.replaceAll(":","\\:")。但它没有给我预期的输出。请帮忙

String[] arr = { "+", "-", "&&", "||", "!", "(", ")", "{", "}",
                "[", "]", "^", "\"", "~", "*", "?", ":", "\\", "AND", "OR" };

    for (int i = 0; i < arr.length; i++) {
//'search' is my input string

        if (search.contains((String) arr[i])) {

            String oldString = (String) arr[i];

            String newString = new String("\\" + arr[i]);
            search = search.replaceAll(oldString, newString);
            String newSearch = new String(search.replaceAll(arr[i],
                    newString));


        }
    }

【问题讨论】:

    标签: java regex string data-structures escaping


    【解决方案1】:

    一旦您意识到 replaceAll 需要一个正则表达式,只需将您的字符编码为正则表达式即可。

    试试这个:

    String newSearch = search.replaceAll("(?=[]\\[+&|!(){}^\"~*?:\\\\-])", "\\\\");
    

    那个古怪的正则表达式是一个“向前看”——一个非捕获断言,即以下字符匹配某些东西——在这种情况下是一个字符类。

    请注意,除了 ] 之外,您不需要转义字符类中的字符(即使是第一个或最后一个减号也不需要转义)。

    \\\\ 是您编写正则表达式文字 \ 的方式(java 转义一次,正则表达式转义一次)


    这是对此工作的测试:

    public static void main(String[] args) {
        String search = "code:xy";
        String newSearch = search.replaceAll("(?=[]\\[+&|!(){}^\"~*?:\\\\-])", "\\\\");
        System.out.println(newSearch);
    }
    

    输出:

    code\:xy
    

    【讨论】:

    • 你还需要转义[
    • @RohitJain 不,你不需要逃避[。试试看
    • @Bohemian.. 试过了,这就是我发表评论的原因。它不工作。
    • @RohitJain 我想亲眼看看!我现在无法检查(使用 iPhone),但会尽快检查。我确定你没有,但我一直在这里学习东西
    • @RohitJain 感谢 Bohemian 和 Rohit。当我使用它时,它给出了一个未封闭的字符类异常,所以 [ 应该被转义吗?另外,如果我的字符串中存在任何应该用转义符替换该符号本身的符号,如何使用这种模式来实现?如何在java中获取该组值以附加“\\”。我尝试了像 a*b 这样的输入,但它失败了。我会再次验证并通知您
    【解决方案2】:

    String#replaceAllregex 作为第一个参数。因此,如果字符串中的输入是 meta-character (例如 - +),您的代码将失败。

    你应该使用String#replace

    而且你也不需要最后的分配:-

    String newSearch = new String(search.replaceAll(arr[i], newString));
    

    因为,你根本没有使用它。您实际上是将修改后的字符串分配回search,因此不需要。

    另外,而不是使用new String(...),来构建你的新字符串。 实际上,您只需要在 if-statement 中添加一行即可。

    现在好了,在解释之后,你现在可以使用下面的for-loop:-

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

    【讨论】:

    • 谢谢罗希特。为了使用replace而不是replaceAll,我必须遍历我的输入字符串,使外循环和内循环正确。我想避免迭代输入字符串(考虑输入字符串长度变大的情况!)。还有一些符号不能用单个 '\' 正确转义......就像 \ 本身一样,我们需要转义它作为 '\\\\' 对吗?
    • @Rohit,4 年多来一直得到您的帮助,感谢您的积极帮助!
    【解决方案3】:

    尝试使用下面的。请使用 replace 方法而不是 ReplaceAll

    search = search.replace(oldString, newString);

    【讨论】:

      【解决方案4】:

      当我尝试下面的代码时,它起作用了

      String[] arr = { "+", "-", "&&", "||", "!", "(", ")", "{", "}",
                          "[", "]", "^", "\"", "~", "*", "?", ":", "\\", "AND", "OR" };
      
              for (int i = 0; i < arr.length; i++) {
          //'search' is my input string
      
                  if (search.contains((String) arr[i])) {
      
                      String oldString = (String) arr[i];
      
                      String newString = new String("\\" + arr[i]);
                      search = search.replaceAll(oldString,(String) ("\\" + newString));
      
      
      
                  }
              }
      

      【讨论】:

      • 试试这个字符串 - a+b.
      猜你喜欢
      • 2014-11-03
      • 2012-11-20
      • 2011-05-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-07-10
      相关资源
      最近更新 更多