繁体   English   中英

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

[英]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

谢谢,

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

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM