7

在我的 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));


        }
    }
4

4 回答 4

13

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

尝试这个:

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

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

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

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


这是对此工作的测试:

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

输出:

code\:xy
于 2012-12-04T05:28:59.103 回答
3

String#replaceAll将 aregex作为第一个参数。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]);
    }
}
于 2012-12-04T05:13:30.173 回答
2

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

搜索 = search.replace(oldString, newString);

于 2012-12-04T05:32:13.500 回答
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));



            }
        }
于 2012-12-04T06:39:50.233 回答