Reputation: 1215
Is there no easy way to replace all occurrences of a (whole) word in a string? I am using this currently and it is not very elegant:
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;
}
Also, the regular expression "^"+toReplace+" "
is not regex safe. For example: when it might contain a character like [
or (
etc.
Edit:
Any reasons why this code:
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;
}
behaves this way when:
input = "test a testtest te[(st string test";
input = replace(input, toReplace, "REP");
System.out.println(input);
a) toReplace = test
prints:
test a testtest te[(st string test
b) toReplace = te[(st
prints:
test a testtest REP string test
Thanks,
Upvotes: 2
Views: 3219
Reputation: 70
input = input.replaceAll("\\b"+Pattern.quote(toReplace)+"\\b", replacement);
\b matches word boundaries, see http://www.regular-expressions.info/wordboundaries.html
Use java.util.regex.Pattern.quote to escape special characters.
Upvotes: 2
Reputation: 425033
You need to know about the regex \b
, which is a zero-width match of a "word boundary". With it, the guys of your method becomes simply one line:
return input.replaceAll("\\b"+Pattern.quote(toReplace)+"\\b", replacement);
Upvotes: 2
Reputation: 191749
Use word boundaries \b
and Pattern.quote
to escape.
return input.replaceAll("\\b" + Pattern.quote(toReplace) + "\\b", replacement);
What \\b
indicates is a zero-width boundary between a word and a non-word character including the very start and very end of the string.
Upvotes: 5
Reputation: 1635
There is a special regexp code for word boundary - \b
. That covers your manual handlings of spaces/line endings beginning as well as other cases like punctuation.
There is a method Pattern.quote()
to quote strings to protect regexp special inside which, as you have suggested, should always be used if the string is arbitrary or might be user-supplied.
So that gives:
input.replaceAll("\\b"+Pattern.quote(toReplace)+"\\b", replacement);
Upvotes: 4