1

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

  1. searchStr 必须是一个完整的单词,这意味着它必须有一个空格、字符串的开头或字符串字符的结尾。
    • 例如
      • startStr = "确认,戴上帽子"
      • searchStr = "开"
      • 替换字符串 = ""
      • 预期=“确认,戴上你的帽子”
  2. searchStr 可能包含正则表达式模式
    • 例如
      • startStr = "删除这个 * 东西"
      • searchStr = "*"
      • 替换字符串 = ""
      • 预期=“删除这个东西”

对于要求 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*"

我错过了什么?

提前致谢

4

4 回答 4

1

该模式"\\b"匹配单词边界,一侧是单词字符,另一侧是非单词字符。*不是单词字符,因此\\b\\*\\b不起作用。Look-behind 和look-ahead 匹配但不消耗模式。您可以指定字符串或空格的开头必须在您的模式之前,并且空格或字符串的结尾必须跟随:

startStr.replaceAll("(?<=^|\\s)"+Pattern.quote(searchStr)+"(?=\\s|$)", replaceStr)
于 2013-10-23T01:41:30.363 回答
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+"]");
  }
}

您可以编写一个小函数来自动生成通配符排列。我承认我在空格上作弊了一点,但我不认为这是一个要求。

在这里在线玩:http: //ideone.com/7uGfIS

于 2013-10-23T03:46:43.290 回答
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]", ""));
于 2013-10-23T01:24:42.733 回答
0

您可以使用(^| )\*( |$)而不是使用\\b

试试这个startStr.replaceAll("(^| )youSearchString( |$)", replaceStr);

于 2013-10-23T06:34:39.990 回答