我想做一个startStr.replaceAll(searchStr,replaceStr),我有两个要求。


searchStr必须是一个完整的单词,这意味着它必须在其周围有空格,字符串开头或字符串结尾。

例如

startStr =“确认后,戴上帽子”
searchStr =“ ON”
replaceStr =“”
期望=“确认,戴上帽子”


searchStr可能包含正则表达式模式

例如

startStr =“删除此*东西”
searchStr =“ *”
replaceStr =“”
预期=“删除此内容”




对于要求1,我发现这可行:

startStr.replaceAll("\\b"+searchStr+"\\b",replaceStr)

对于要求2,我发现这可行:

startStr.replaceAll(Pattern.quote(searchStr), replaceStr)

但是我不能让他们一起工作:

startStr.replaceAll("\\b"+Pattern.quote(searchStr)+"\\b", replaceStr)

这是失败的简单测试用例

startStr = "remove this * thing but not this*"

searchStr = "*"

replaceStr = ""

expected = "remove this thing but not this*"

actual = "remove this * thing but not this*"

我想念什么?

提前致谢

最佳答案

首先,\ b(或单词边界)对星号不起作用。原因是\ b仅检测单词字符的边界。正则表达式解析器不会将*识别为单词字符,因此以正则表达式开头或结尾的通配符赋予的单词将不会被有效的单词边界包围。

参考页:
http://www.regular-expressions.info/wordboundaries.html
http://docs.oracle.com/javase/tutorial/essential/regex/bounds.html

您可能想要的一个选项是在正则表达式中提供通配符排列:

(?<=\s|^)(ON|\*N|O\*|\*)(?=\s|$)


这是一个Java示例:

import java.util.regex.Pattern;
import java.util.regex.Matcher;

class RegExTest
{
  public static void main(String[] args){
    String sourcestring = "ON cONfirmation, put * your hat";
    sourcestring = sourcestring.replaceAll("(?<=\\s|^)(ON|\\*N|O\\*|\\*)(?=\\s|$)","").replaceAll("  "," ").trim();
    System.out.println("sourcestring=["+sourcestring+"]");
  }
}


您可以编写一个小函数来自动生成通配符排列。我承认我对这些空间有点作弊,但是我认为这并不是必须的。

在此处在线玩:http://ideone.com/7uGfIS

09-25 20:46