java - 替换可能包含正则表达式的整个标记

标签 java regex

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

  1. searchStr 必须是一个完整的单词,这意味着它周围必须有空格、字符串开头或字符串结尾字符。
    • 例如
      • startStr =“确认后,戴上帽子”
      • searchStr =“ON”
      • replaceStr = ""
      • 预期=“确认,戴上帽子”
  2. 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/

相关文章:

javascript - 如何在Javascript中获取字符串的href

regex - shell 脚本的空格分隔参数

java - Spring Boot ProGuard 嵌入式 Tomcat 混淆

java - 计算一个数字在排序数组中出现的次数

java - 检查 2D 数组中的 4 个连续相同的对角线元素(Connect 4 游戏)

java - 非法选项: -cacerts for keytool in gitlab-ci with gradle:jdk8

python - 如何只匹配特定字符?

java - 正则表达式 Java。为什么要使用交集?

regex - Apache 强制某些 URL 使用 HTTP,而所有其他 URL 使用 https

java - 传递包含空格的 shell 脚本参数作为 java 系统属性