有关String.replaceAll()和String.replaceFirst()方法的问题

时间:2010-05-13 13:34:29

标签: java string replace

我需要对一段字符串执行简单的字符串替换操作。我遇到了以下问题并希望得到一些建议。

  1. 在我收到的原始字符串中,我可以将<div class="more">之类的字符串替换为其他内容。
  2. 但是,在相同的原始字符串中,如果我想要替换如下所示的长字符串,它将无法工作。通话结束后没有任何内容被取代。
  3. <div class="more"><a href="http://SERVER_name/profiles/atom/mv/theboard/entries/related.do?email=xyz.com&amp;ps=20&amp;since=1273518953218&amp;sinceEntryId=abc-def-123-456">More...</a></div>

    我试过这两种方法:

    originalString.replaceFirst(moreTag, newContent);
    originalString.replaceAll(moreTag, newContent);
    

    提前致谢。

4 个答案:

答案 0 :(得分:6)

你需要掌握替换的结果并进一步使用它:

String newString = originalString.replaceFirst(moreTag, newContent);
System.out.println(newString);

说明:Java中的字符串是不可变的java.lang.String的行为方法不会改变内部价值。他们将返回修改后的结果。

如果仍然没有返回所需的结果,则moreTag根本不匹配任何内容。您提到的方法需要regular expression。您可以在Pattern javadoc中找到如何撰写有效的正则表达式模式。

答案 1 :(得分:0)

你能告诉我们你的代码吗?

您是否知道 moreTag 字符串(replaceFirst / replaceAll的第一个参数)被假定为正则表达式?

如果你不想在这里使用正则表达式,你可以使用普通的replace方法。

答案 2 :(得分:0)

字符串是不可变的,你保存替换操作的结果吗?

测试你的正则表达式,如果它真的符合你的想法,你会在网上找到一些工具。特别注意妥善逃避特殊角色。

另外,如果您不需要正则表达式,请考虑使用StringTokenizer和StringBuilder。

答案 3 :(得分:0)

以下是replaceAllreplaceFirst用法的示例:

    String s = "Hi there! John here!";

    s = s.replaceAll("ere", "arrr");
    System.out.println(s);
    // prints "Hi tharrr! John harrr!"

    s = s.replaceFirst("!", "?");
    System.out.println(s);
    // prints "Hi tharrr? John harrr!"

正如其他人所提到的,两者实际上都是基于正则表达式的:

    System.out.println("Hello???".replaceAll("?", "!"));
    // throws PatternSyntaxException: Dangling meta character '?'

这里的问题是?是正则表达式元字符,并将其视为文字问号,你必须逃避它:

    System.out.println("Hello???".replaceAll("\\?", "!"));
    // prints "Hello!!!"

有时字符串模式是未知的,在这种情况下,您可以使用Pattern.quote

    String unknown = "?";
    System.out.println(
        "Hello???".replaceAll(Pattern.quote(unknown), "!")
    ); // prints "Hello!!!"

稍微复杂一点,替换字符串实际上也是基于regex的。

    System.out.println(
        "USD 10".replaceAll("USD", "dollar$")
    );
    // throws StringIndexOutOfBoundsException: index out of range: 7

要引用替换字符串,请使用Matcher.quoteReplacement

    System.out.println(
        "USD 10".replaceAll("USD", Matcher.quoteReplacement("dollar$"))
    ); // prints "dollar$ 10"

  

但是如果我只是想做一个简单的无正则表达式替换呢?

然后,要使用replaceFirst,您必须引用模式和替换字符串:

import java.util.regex.Pattern;
import java.util.regex.Matcher;


String replaceFrom = ...;
String replaceTo = ...;

String before = ...;

String after = before.replaceFirst(
   Pattern.quote(replaceFrom), Matcher.quoteReplacement(replaceTo)
);

如果您需要replaceAll,那么您只需使用通常的非正则表达式replace方法:

String after = before.replace(replaceFrom, replaceTo);