【问题标题】:String replace in JavaJava中的字符串替换
【发布时间】:2009-12-23 00:03:00
【问题描述】:

我目前有一个包含字符 A、B 和 C 的字符串,例如字符串看起来像

"A some other random stuff B C"

其他随机的东西不包含 A、B 或 C 我想分别用“A”、“B”和“C”替换 A、B 和 C 目前我正在做的最好的方法是什么:

String.replace("A", "'A'").replace("B", "'B'").replace("C", "'C'")

【问题讨论】:

    标签: java regex string


    【解决方案1】:

    如果 A、B 和 C 是那些确切的单个字符,则

    cletus 的答案可以正常工作,但如果它们可能是更长的字符串并且您只是出于示例目的将它们称为 A、B 和 C,则不会。如果它们是较长的字符串,您需要这样做:

    String input = "FOO some other random stuff BAR BAZ";
    String output = input.replaceAll("FOO|BAR|BAZ", "'$0'");
    

    您还需要转义 FOO、BAR 和 BAZ 中的任何特殊字符,以免它们被解释为特殊的正则表达式符号。

    【讨论】:

    • $1 在这种情况下也可以工作,因为整个匹配项都被捕获在括号中。
    • 实际上括号不是必需的 - 我会更新帖子。
    【解决方案2】:

    使用正则表达式:

    String input = "A some other random stuff B C";
    String output = input.replaceAll("[ABC]", "'$0'");
    

    输出:

    'A' some other random stuff 'B' 'C'
    

    【讨论】:

    • 它只是返回 "'1' some other random stuff '1' '1'";
    • 把我的语言弄混了 :) 在 Java 中引用 args 是 $N,而不是像我原来那样使用 \N。
    【解决方案3】:

    查看来自 Apache Commons Lang 的 StringUtils 及其各种 replace 方法。

    【讨论】:

    • 赞成票...我总是先看看 apache *Utils first!!
    • 我不喜欢 Apache Commons,因为它们似乎在泛型之前的时代几乎消失了。我的意思是来吧,引入泛型的 Java 5 在几周前就达到了 EOL。
    • @Esko 不假。虽然在操作String 时不确定这是一个问题:)
    【解决方案4】:

    如果那些是相当复杂的字符串,我认为正则表达式并不适合。

    考虑将其包装在您自己的实用方法中,将数组或列表作为参数。

    public static String replace(String string, String[] toFind, String[] toReplace) {
        if (toFind.length != toReplace.length) {
            throw new IllegalArgumentException("Arrays must be of the same length.");
        }
        for (int i = 0; i < toFind.length; i++) {
            string = string.replace(toFind[i], toReplace[i]);
        }
        return string;
    }
    

    也许 Apache Commons 或 Google 代码中已经有一个。如果您更喜欢 3rd 方 API 而不是自产的东西,请看一看。

    编辑:为什么要否决技术上正确但您认为不喜欢的答案?只是不要投票。

    【讨论】:

    • 好主意,但替换只需要“char”,他想用字符串('A')替换“char”。此外,不要循环修改字符串——性能会很糟糕(接近坏代码)。如果您想像以前一样对其进行迭代,请使用一些字符串构建机制(比如,可能是 StringBuilder?)
    • 顺便说一句,我从不建议优化性能,除非在一些非常明显的情况下——在循环中不必要地创建和销毁对象就是其中之一。
    • String 有两种替换方法。一个采用 char 另一个采用 CharSequence (从几年前的 Java 1.5 开始)。猜猜 String 实现了什么?链接:java.sun.com/javase/6/docs/api/java/lang/…
    • 你是对的——我错过了第二次替换(我什至检查了!)。尽管如此,他仍试图找到一个字符(长度为 1)并将其替换为 3,您的代码只会引发异常。性能评论指的是每个 .replace 调用实际上分配了一个新字符串。每次调用它时,您都会丢弃旧的并分配一个新的(字符串 = 字符串)。这在一次性情况下是可以的,但要认真——避免循环使用。这是在一个大循环中实际上会破坏你的表现的少数几件事之一。
    • 巧合的是,我检查了replace(CharSequence, CharSequence) 的来源,它确实 如您所演示的那样实际上在后台使用了replaceAll,但随后多了一个标志Pattern.LITERAL这可能会减少开销。
    【解决方案5】:

    其他人的答案更好,但是在您尝试学习的假设下,我想指出您原始代码的问题。

    这将是您正在尝试做的事情的“固定”版本(使用您的风格,这很接近)以及您需要做的事情才能使其发挥作用:

    public String quoteLetters(String s)
    {
        return s.replace("A", "'A'").replace("B", "'B'").replace("C", "'C'");
    }
    

    以下是您遇到的问题:

    • Replace 是一种方法,而不是静态函数,因此您必须在 String 的实例上调用它,而不是 String 本身。
    • 替换返回一个新字符串的实例,它不能修改原始字符串。在我的代码中,我正在“返回”新字符串,s 保持不变。
    • 如果这是家庭作业,您应该这样标记它。
    • 不要像我那样链接它们——其他答案更好,因为我实际上会创建 3 个新字符串,然后立即销毁它们。

    【讨论】:

    • 开销太大,用replace()就行了。或者安装 JDK >= 1.5。
    • 当然——我什至这么说。我只是在告诉他他做错了什么,假设他正在努力学习。
    • 还有关于 replace() 的好建议我已经在 J​​ava 1.1 土地上生活太久了。
    猜你喜欢
    • 2015-12-23
    • 1970-01-01
    • 2015-05-01
    • 2012-06-27
    • 2013-07-09
    • 2021-01-27
    • 2015-05-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多