Java-如何在字符串中的“(”或“)”前面添加“ \\”

时间:2019-08-01 08:20:50

标签: java string replace split

我正在阅读文档并删除一些单词。 我具有以下功能:

 //Takes a string and removes the word
 private static String removeWord(String string, String word) {
    if (string.contains(word)) {
        String tempWord = word.trim();
        string = string.replaceAll(tempWord, "");
    }
    return string;
}

例如,当我尝试替换时,出现以下问题:

Hello world (

给我以下错误:

  

原因:java.util.regex.PatternSyntaxException:索引14附近的未封闭组

做一些研究,我发现这是因为split()期望使用正则表达式,并且使用方括号来标记正则表达式中的捕获组。

所以我做到了:

private static String removeWord(String string, String word) {
    if (string.contains(word)) {
        String [] temp = word.split(" ");
        word = "";
        for (int i = 0; i < temp.length ; i++) {
            if (temp[i].equals("(")){
                word += " "+ "\\(";
            }else if (temp[i].equals(")")){
                word += " "+ "\\)";
            } else {
                word += temp[i] + " ";
            }
        }
        String tempWord = word.trim();
        string = string.replaceAll(tempWord, "");
    }
    return string;
}

此代码不是最佳解决方案。因为有时字符串像(Hello world

我如何改进这部分代码?

2 个答案:

答案 0 :(得分:4)

您似乎正在尝试手动转义正则表达式。我的建议是:不要。

即使您已经成功地处理过(),您仍然会有大量其他在正则表达式中具有特殊含义的字符可以转义,例如*+[]\?等。

幸运的是,有一种名为Pattern.quote的非常方便的方法可以自动为您完成此操作:

 private static String removeWord(String string, String word) {
    if (string.contains(word)) {
        String tempWord = word.trim();
        string = string.replaceAll(Pattern.quote(tempWord), "");
    }
    return string;
}

答案 1 :(得分:0)

private static String removeWord(String string, String word) {
    return string.replaceFirst("\\W+" + word + "\\W+","");
}

\ W匹配非单词字符enter link description here 。如果要替换所有事件,也可以使用replaceAll,如果要替换特定数量的事件,则可以在循环中使用replaceFirst。