2

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

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

4 回答 4

5

使用单词边界\bPattern.quote转义。

return input.replaceAll("\\b" + Pattern.quote(toReplace) + "\\b", replacement);

指示的是\\b单词和非单词字符之间的零宽度边界,包括字符串的开头和结尾。

于 2013-04-03T12:58:12.003 回答
4

单词边界有一个特殊的正则表达式代码 - \b。这涵盖了您对空格/行尾开头的手动处理以及标点符号等其他情况。

有一种Pattern.quote()引用字符串的方法来保护正则表达式的特殊性,正如您所建议的,如果字符串是任意的或可能是用户提供的,则应始终使用该方法。

所以这给出了:

input.replaceAll("\\b"+Pattern.quote(toReplace)+"\\b", replacement);
于 2013-04-03T13:00:20.910 回答
2

您需要了解 regex \b,它是“单词边界”的零宽度匹配。有了它,你方法的人就变成了一行:

return input.replaceAll("\\b"+Pattern.quote(toReplace)+"\\b", replacement);
于 2013-04-03T13:03:47.213 回答
2
input = input.replaceAll("\\b"+Pattern.quote(toReplace)+"\\b", replacement);

\b 匹配单词边界,参见http://www.regular-expressions.info/wordboundaries.html

使用 java.util.regex.Pattern.quote 转义特殊字符。

于 2013-04-03T13:01:58.450 回答