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