我正在阅读文档并删除一些单词。 我具有以下功能:
//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
。
我如何改进这部分代码?
答案 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。