Java从字符串中替换精确的子字符串

标签 java regex string str-replace

我有以下字符串:

String str = "6,20,9,10,19,11,5,3,1,2";

我想将确切的字符串 ,21, 替换为空字符串,避免使用子字符串 ,2011,参与了替换。

我有这个代码:

// assuming that substr = ",2" or "1,"

if(str.startsWith(substr+",")){
    str = str.replace("^"+substr+",$","");
}               
else if(str.contains(","+substr+",")){
    str = str.replace("^"+substr+",$","");
}   
else if(str.endsWith(","+substr)){
    str = str.replace("^,"+substr+"$","");
}

但看来我的正则表达式是错误的。我应该使用哪个正则表达式来解决它?

最佳答案

我的回答是:“你想要实现什么目标?”

如果您尝试过滤,我会选择String.split(","),然后过滤字符串数组中生成的项目。最终我会加入他们(如果你不受运行时的限制)。

类似于(未经测试):

String[] splits = myString.split(",");
// ... manipulate splits (filter into a list if you want...)
StringUtils.join(splits, ", "); // possibly replace with array from filtered list
  • 分割可以替换为过滤列表的 toArray

按照您的方式解决这个问题可能会很棘手。当您尝试匹配一个项目时,您就消除了匹配其邻居的机会。您需要做的是匹配聚合。

这只是一个开始(未经测试,基于this):

    List<String> matches = new ArrayList<String>();
    Matcher m = Pattern.compile("(^[12],|,[12],|[12]$)").matcher("1,6,20,9,10,19,11,5,3,1,2");
    if (m.find()) {
        do {
            System.out.println("Matched "+m.group());
            matches.add(m.group());
        } while (m.find(m.start()+1));
    }

    for (String match : matches){
        System.out.println(match);
    }

您可以尝试分析这两种方式的运行时,也许稍后会扩展我的答案:-)

关于Java从字符串中替换精确的子字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21405699/

相关文章:

c++ - 为什么使用字符串会导致退出代码 3 而使用 char[] 不会

c - 字符串数组的段错误

Bash 4.3.33 中的字符串替换(小写)- 错误替换错误

java - SPOJ 中的 NZEC 错误

java - list 执行的正确性

java - 使用 Java 从具有访问者模式的 AST 构建控制流图

regex - 在 Ubuntu 中使用重命名递归更改文件前缀,(正则表达式不起作用)

机器之间的Java jar执行差异

java - JUnit 预期异常

python - 正则表达式检查链接是否指向文件