我想做一个startStr.replaceAll(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*"
我错过了什么?
提前致谢
答案 0 :(得分:1)
模式"\\b"
匹配单词边界,一边是单词字符,另一边是非单词字符。 *
不是单词字符,因此\\b\\*\\b
不起作用。后视和前瞻匹配,但不消耗模式。您可以指定字符串或空格的开头必须位于模式之前,并且该空格或字符串的结尾必须遵循:
startStr.replaceAll("(?<=^|\\s)"+Pattern.quote(searchStr)+"(?=\\s|$)", replaceStr)
答案 1 :(得分:1)
首先,\ 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+"]");
}
}
您可以编写一个小函数来自动生成通配符排列。我承认我对这些空间作了一点欺骗,但我认为无论如何这都不是必需的。
答案 2 :(得分:0)
试试这个,
删除"ON"
StringBuilder stringBuilder = new StringBuilder();
String[] splittedValue = startStr.split(" ");
for (String value : splittedValue)
{
if (!value.equalsIgnoreCase("ON"))
{
stringBuilder.append(value);
stringBuilder.append(" ");
}
}
System.out.println(stringBuilder.toString().trim());
删除"*"
String startStr1 = "remove this * thing";
System.out.println(startStr1.replaceAll("\\*[\\s]", ""));
答案 3 :(得分:0)
您可以使用(^| )\*( |$)
代替\\b
试试这个startStr.replaceAll("(^| )youSearchString( |$)", replaceStr);