Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/330.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Java中,用转义前的特殊字符替换特殊字符_Java_Regex_String_Data Structures_Escaping - Fatal编程技术网

在Java中,用转义前的特殊字符替换特殊字符

在Java中,用转义前的特殊字符替换特殊字符,java,regex,string,data-structures,escaping,Java,Regex,String,Data Structures,Escaping,在我的java代码中,如果一个字符串输入有任何提到的特殊字符,那么前面应该有\\ 特殊字符集是{+,-,&&&,||,!,(,),{,},[,],^,“,~,*,?,:,\}。我尝试使用String.replaceAll(旧的,新的),但令我惊讶的是,它不起作用,尽管我为“旧的”和“新的”给出了正确的值 if old=":",new="\:" 我将特殊字符放在字符串数组中,在for循环中迭代,检查它是否存在于字符串中,如果是,input.replaceAll(“:”,“\\:”)。但它没有给我

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

特殊字符集是
{+,-,&&&,||,!,(,),{,},[,],^,“,~,*,?,:,\}
。我尝试使用
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年多的帮助,感谢您的积极帮助!