有没有简单的方法来替换字符串中所有出现的(整个)单词?我目前正在使用它,它不是很优雅:
public static String replace(String input, String toReplace,
String replacement){
if(input==null) throw new NullPointerException();
input = input.replace(" "+toReplace+" ", " "+replacement+" ");
input = input.replaceAll("^"+toReplace+" ", replacement+" ");
input = input.replaceAll(" "+toReplace+"$", " "+replacement);
return input;
}
此外,正则表达式"^"+toReplace+" "
不是正则表达式安全的。例如:它可能包含[
或(
等字符
修改
此代码的任何原因:
public static String replace(String input, String toReplace,
String replacement){
if(input==null) throw new NullPointerException();
input = input.replace(" "+toReplace+" ", " "+replacement+" ");
input = input.replaceAll(Pattern.quote("^"+toReplace+" "), replacement+" ");
input = input.replaceAll(Pattern.quote(" "+toReplace+"$"), " "+replacement);
//input = input.replaceAll("\\b" + Pattern.quote(toReplace) + "\\b", replacement);
return input;
}
在以下情况下采用这种方式:
input = "test a testtest te[(st string test";
input = replace(input, toReplace, "REP");
System.out.println(input);
a)toReplace = test
打印:
test a testtest te[(st string test
b)toReplace = te[(st
打印:
test a testtest REP string test
谢谢,
答案 0 :(得分:5)
使用字词边界\b
和Pattern.quote
来逃避。
return input.replaceAll("\\b" + Pattern.quote(toReplace) + "\\b", replacement);
\\b
表示的是单词和非单词字符之间的零宽度边界,包括字符串的开头和结尾。
答案 1 :(得分:4)
字边界有一个特殊的正则表达式代码 - \b
。这包括你开始的空格/行结尾的手动处理以及标点符号等其他情况。
有一个方法Pattern.quote()
引用字符串来保护regexp special,如你所建议的那样,如果字符串是任意的或者可能是用户提供的话,应该总是使用它。
所以这给了:
input.replaceAll("\\b"+Pattern.quote(toReplace)+"\\b", replacement);
答案 2 :(得分:2)
input = input.replaceAll("\\b"+Pattern.quote(toReplace)+"\\b", replacement);
\ b匹配字边界,请参阅http://www.regular-expressions.info/wordboundaries.html
使用java.util.regex.Pattern.quote转义特殊字符。
答案 3 :(得分:2)
您需要了解正则表达式\b
,它是“字边界”的零宽度匹配。有了它,你的方法的人只会变成一行:
return input.replaceAll("\\b"+Pattern.quote(toReplace)+"\\b", replacement);