![](/img/trans.png)
[英]how to replace all occurences of a word in a string with another word in java?
[英]Replace all occurences of a word in a string using regex
有没有简单的方法来替换字符串中所有出现的(整个)单词? 我目前正在使用它,它不是很优雅:
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
print:
test a testtest REP string test
谢谢,
使用单词边界\\b
和Pattern.quote
进行转义。
return input.replaceAll("\\b" + Pattern.quote(toReplace) + "\\b", replacement);
什么\\\\b
表示单词和非单词字符之间的零宽度边界,包括字符串的开头和结尾。
字边界有一个特殊的正则表达式代码 - \\b
。 这涵盖了空间/行结尾的手动处理以及标点符号等其他情况。
有一个方法Pattern.quote()
引用字符串来保护regexp特殊内部,正如你所建议的那样,如果字符串是任意的或者可能是用户提供的话,应该总是使用它。
所以这给了:
input.replaceAll("\\b"+Pattern.quote(toReplace)+"\\b", replacement);
input = input.replaceAll("\\b"+Pattern.quote(toReplace)+"\\b", replacement);
\\ b匹配单词边界,请参阅http://www.regular-expressions.info/wordboundaries.html
使用java.util.regex.Pattern.quote来转义特殊字符。
你需要知道正则表达式\\b
,它是“单词边界”的零宽度匹配。 有了它,你的方法的人变成了一行:
return input.replaceAll("\\b"+Pattern.quote(toReplace)+"\\b", replacement);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.