使用正则表达式替换字符串中所有出现的单词

时间:2013-04-03 12:53:03

标签: java regex string replace

有没有简单的方法来替换字符串中所有出现的(整个)单词?我目前正在使用它,它不是很优雅:

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

谢谢,

4 个答案:

答案 0 :(得分:5)

使用字词边界\bPattern.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);