我想做一个 startStr.replaceAll(searchStr, ReplaceStr) 并且我有两个要求。
- searchStr 必须是一个完整的单词,这意味着它周围必须有空格、字符串开头或字符串结尾字符。
- 例如
- startStr =“确认后,戴上帽子”
- searchStr =“ON”
- replaceStr = ""
- 预期=“确认,戴上帽子”
- 例如
- searchStr 可能包含正则表达式模式
- 例如
- startStr =“删除这个*东西”
- 搜索Str =“*”
- replaceStr = ""
- 预期=“删除这个东西”
- 例如
对于要求 1,我发现这可行:
startStr.replaceAll("\\b"+searchStr+"\\b",replaceStr)
对于要求 2,我发现这可行:
startStr.replaceAll(Pattern.quote(searchStr), ReplaceStr)
但我无法让他们一起工作:
startStr.replaceAll("\\b"+Pattern.quote(searchStr)+"\\b", ReplaceStr)
这是失败的简单测试用例
startStr =“删除这个*东西,但不删除这个*”
searchStr = "*"
replaceStr = ""
预期=“删除这个东西,但不删除这个*”
actual =“删除这个*东西,但不删除这个*”
我错过了什么?
提前致谢
最佳答案
首先,\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
关于java - 替换可能包含正则表达式的整个标记,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19531103/