在Java中,用转义前的特殊字符替换特殊字符
在我的java代码中,如果一个字符串输入有任何提到的特殊字符,那么前面应该有在Java中,用转义前的特殊字符替换特殊字符,java,regex,string,data-structures,escaping,Java,Regex,String,Data Structures,Escaping,在我的java代码中,如果一个字符串输入有任何提到的特殊字符,那么前面应该有\\ 特殊字符集是{+,-,&&&,||,!,(,),{,},[,],^,“,~,*,?,:,\}。我尝试使用String.replaceAll(旧的,新的),但令我惊讶的是,它不起作用,尽管我为“旧的”和“新的”给出了正确的值 if old=":",new="\:" 我将特殊字符放在字符串数组中,在for循环中迭代,检查它是否存在于字符串中,如果是,input.replaceAll(“:”,“\\:”)。但它没有给我
\\
特殊字符集是{+,-,&&&,||,!,(,),{,},[,],^,“,~,*,?,:,\}
。我尝试使用String.replaceAll(旧的,新的)
,但令我惊讶的是,它不起作用,尽管我为“旧的”和“新的”给出了正确的值
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));
}
}
String[]arr={“+”,“-”,“&&&-”,“| |”,“!”,“(“,”,“{”,“}”,
“[”、“]”、“^”、“\”、“~”、“*”、“?”、“:”、“\\”、“和”、“或”};
对于(int i=0;i
将regex
作为第一个参数。因此,如果字符串中的输入是元字符,则代码将失败,如-+
你应该使用
而且你也不需要最后的作业:-
String newSearch = new String(search.replaceAll(arr[i], newString));
实际上,您是在将修改后的字符串重新分配给搜索
,因此它不是必需的
另外,不要使用新字符串(…)
,而是构建新字符串。
事实上,在if语句中只需要一行
好了,在解释完之后,您现在可以使用下面的for循环
:-
for (int i = 0; i < arr.length; i++) {
if (search.contains(arr[i])) {
search = search.replace(arr[i], "\\" + arr[i]);
}
}
for(int i=0;i
一旦你意识到replaceAll需要一个正则表达式,你只需将你的字符编码为正则表达式即可
试试这个:
String newSearch = search.replaceAll("(?=[]\\[+&|!(){}^\"~*?:\\\\-])", "\\\\");
这个古怪的正则表达式是一个“向前看”(lookahead)——一个非捕获断言,表示下面的字符与某个字符匹配——在本例中是一个字符类
请注意,除了]
(如果是第一个或最后一个,即使是负号也不需要转义)字符类中的字符
\\\\
是如何编写正则表达式文本的\
(对java转义一次,对正则表达式转义一次)
以下是对这项工作的测试:
public static void main(String[] args) {
String search = "code:xy";
String newSearch = search.replaceAll("(?=[]\\[+&|!(){}^\"~*?:\\\\-])", "\\\\");
System.out.println(newSearch);
}
输出:
code\:xy
请尝试使用以下方法。请使用替换方法而不是ReplaceAll
search=search.replace(oldString,newString);当我尝试下面的代码时,它工作了
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));
}
}
String[]arr={“+”,“-”,“&&&-”,“| |”,“!”,“(“,”,“{”,“}”,
“[”、“]”、“^”、“\”、“~”、“*”、“?”、“:”、“\\”、“和”、“或”};
对于(int i=0;i
您还需要退出[
@RohitJain不,您不需要退出[
。试试看it@Bohemian..我试过了,这就是我发布评论的原因。它不起作用。@RohitJain我想亲自看看!我现在无法检查(使用iPhone)但我会尽快检查。我肯定你没有,但我一直在学习here@RohitJain感谢Bohemian和Rohit。当我使用它时,它给出了一个未关闭的字符类异常,所以[应该转义对吗?如果我的字符串中存在任何符号,应该用转义替换,然后是该符号本身,如何使用此模式实现此目的?如何使该组值附加“\\”在java中。我尝试了a*b之类的输入,但失败了。我将再次验证它,并让您知道尝试此字符串-a+b
。谢谢Rohit。为了使用replace而不是replaceAll,我必须在输入字符串上循环,使外部循环和内部循环正确。我想避免迭代输入字符串(考虑输入字符串长度变大的情况!)还有一些符号不能用单个“\”来转义,对吗?就像\本身一样,我们需要将其转义为“\ \ \”对吗?@Rohit,我得到了您4年多的帮助,感谢您的积极帮助!