如何在 Java 中替换不区分大小写的文字子字符串

新手上路,请多包涵

在String中使用方法 replace(CharSequence target, CharSequence replacement) ,如何使目标不区分大小写?

例如,它现在的工作方式:

 String target = "FooBar";
target.replace("Foo", "") // would return "Bar"

String target = "fooBar";
target.replace("Foo", "") // would return "fooBar"

我怎样才能使替换(或者如果有更合适的方法)不区分大小写,以便两个示例都返回“Bar”?

原文由 J. Lin 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1k
2 个回答
String target = "FOOBar";
target = target.replaceAll("(?i)foo", "");
System.out.println(target);

输出:

 Bar

值得一提的是 replaceAll 将第一个参数视为正则表达式模式,这可能会导致意外结果。要解决此问题,还应按照评论中的建议使用 Pattern.quote

原文由 lukastymo 发布,翻译遵循 CC BY-SA 3.0 许可协议

由于某些字符是保留的,正则表达式管理起来相当复杂:例如, "foo.bar".replaceAll(".") 产生一个空字符串,因为点表示“任何东西”如果你只想替换点应该被指出作为参数 "\\."

一个更简单的解决方案是使用 StringBuilder 对象来搜索和替换文本。它需要两个:一个包含小写版本的文本,而第二个包含原始版本。搜索是在小写内容上进行的,检测到的索引也将替换原始文本。

 public class LowerCaseReplace
{
    public static String replace(String source, String target, String replacement)
    {
        StringBuilder sbSource = new StringBuilder(source);
        StringBuilder sbSourceLower = new StringBuilder(source.toLowerCase());
        String searchString = target.toLowerCase();

        int idx = 0;
        while((idx = sbSourceLower.indexOf(searchString, idx)) != -1) {
            sbSource.replace(idx, idx + searchString.length(), replacement);
            sbSourceLower.replace(idx, idx + searchString.length(), replacement);
            idx+= replacement.length();
        }
        sbSourceLower.setLength(0);
        sbSourceLower.trimToSize();
        sbSourceLower = null;

        return sbSource.toString();
    }

    public static void main(String[] args)
    {
        System.out.println(replace("xXXxyyyXxxuuuuoooo", "xx", "**"));
        System.out.println(replace("FOoBaR", "bar", "*"));
    }
}

原文由 ilmassa 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题