使用Java中特殊字符前面的转义替换特殊字符

时间:2012-12-04 05:09:28

标签: java regex string data-structures escaping

在我的java代码中,如果字符串输入中包含任何提到的特殊字符,那么前面应该有\\

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

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

我将特殊字符放在一个String数组中,在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));


        }
    }

4 个答案:

答案 0 :(得分:10)

一旦你意识到replaceAll需要一个正则表达式,这只是将你的字符编码为正则表达式的问题。

试试这个:

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

那个糟糕的正则表达式是“向前看” - 一个非捕获断言,以下char匹配某些东西 - 在本例中是一个字符类。

注意除了]之外你不需要在字符类中转义字符(即使是第一个或最后一个也不需要转义)。

\\\\是你编写正则表达式文字\的方法(对于java,一次为正则表达式转义一次)


以下是对此工作的测试:

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

输出:

code\:xy

答案 1 :(得分:3)

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]);
    }
}

答案 2 :(得分:2)

尝试使用下面的一个。请使用替换方法而不是ReplaceAll

search = search.replace(oldString,newString);

答案 3 :(得分:0)

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

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



            }
        }