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

Che*_*ese 6 java regex string escaping data-structures

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

特殊字符集是{+, -, &&, ||, !, (, ), {, },[, ], ^, "", ~, *, ?, :, \}.String.replaceAll(old,new)虽然我给'old'和'new'赋予了适当的价值,但我试着用它,但令我惊讶的是它没有用.

if old=":",new="\:"
Run Code Online (Sandbox Code Playgroud)

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


        }
    }
Run Code Online (Sandbox Code Playgroud)

Boh*_*ian 11

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

试试这个:

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

那个糟糕的正则表达式是"向前看" - 一个非捕获断言,即下面的char匹配某些东西 - 在这种情况下是一个字符类.

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

\\\\是你如何编写一个正则表达式的文字\(为正则表达式Java换一次,连用)


以下是对此工作的测试:

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

输出:

code\:xy
Run Code Online (Sandbox Code Playgroud)


Roh*_*ain 3

String#replaceAll采用 aregex作为第一个参数。因此,如果字符串中的输入类似于meta-character- ,您的代码将会失败+

你应该使用String#replace.

而且你也不需要最后一个作业:-

String newSearch = new String(search.replaceAll(arr[i], newString));
Run Code Online (Sandbox Code Playgroud)

因为,您根本没有使用它。事实上,您将修改后的字符串分配回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]);
    }
}
Run Code Online (Sandbox Code Playgroud)