java - 在 Java 中用特殊字符前面的转义符替换特殊字符

标签 java regex string data-structures escaping

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

特殊字符集为{+, -, &&, ||, !, (, ), {, },[, ], ^, "", ~, *, ?, :,\}。我尝试使用 String.replaceAll(old,new) ,但令我惊讶的是它不起作用,即使我为“旧”和"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));


        }
    }

最佳答案

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

试试这个:

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

那个古怪的正则表达式是一个“前瞻” - 一个非捕获断言,以下字符匹配某些内容 - 在本例中是一个字符类。

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

\\\\ 是编写正则表达式文字 \ 的方式(对于 java 转义一次,对于 regex 转义一次)


这是对此工作的测试:

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

输出:

code\:xy

关于java - 在 Java 中用特殊字符前面的转义符替换特殊字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13696461/

相关文章:

java - 我如何在 Java 中使用字符串来做到这一点?

java - "One-time use methods"- 看起来更好,但更难阅读?

java - 如何在 Groovy 中访问 Java 原始 int 类型?

c# - 字符串操作 : How to replace a string with a specific pattern

ios - 从主题标签正则表达式中删除点

php - 正则表达式忽略 HTML 标签中已有的 URL

Python:将字母数字字符串可逆地编码为整数

java - Hibernate/JPA 单向 OneToMany 与源表中常量值的连接条件

java - 使用自己的线程来实现带有短动画的弹出窗口?

javascript - 从日期获取年份的正则表达式 - Javascript