替换java中的字符串

时间:2018-02-16 12:56:21

标签: java

我正在尝试将短格式单词替换为java中的字符串,但不知道如何以良好的方式执行它,因为我可以有多个('ve're'nt)等等。使用数组列表是否合适?若是,我该如何实现呢?

到目前为止我尝试过:

public class main {

 public static void main(String[] args) {

  String s = "We've been doing this for ages. I'm having a difficulty doing this. Thats getting confusing.";
  s = s.replaceAll("we've", "we have");
  s = s.replaceAll("I'm", "I am");
  s = s.replaceAll("that's", "that is");

 }
}

谢谢!

3 个答案:

答案 0 :(得分:1)

您可以使用正则表达式更有效地执行此操作。

首先,构建一个包含搜索和替换的地图。

Map<String, String> replacements =
    Map.of("we've", "we have", "I'm", "I am" /* etc */);

(或一些Java 9之前的等价物)

现在,构建一个正则表达式以匹配您要替换的内容:

Pattern p = Pattern.compile(
    replacements.keySet()
        .stream()
        .map(Pattern::quote)
        .collect(Collectors.joining("|")));

现在,创建一个Matcher和一个StringBuilder来累积新字符串:

Matcher m = p.matcher(s);
StringBuffer sb = new StringBuffer();
while (m.find()) {
  String replacement = replacements.get(m.group(0));
  m.appendReplacement(sb, replacement);
}
m.appendTail(sb);

String newS = sb.toString();

Ideone demo

答案 1 :(得分:0)

您可以使用Map<String, String>,例如HashMap,其中键将是替换的缩写形式,替换字符串的值。然后你可以迭代Map.entrySet()并在字符串上调用replace方法。

代码可以(请注意我省略了首字母 - 除了我必须是大写的 - 以避免大写问题):

    String str = s;
    HashMap<String, String> replacements = new HashMap<>();
    replacements.put("e've", "e have");
    replacements.put("I'm", "I am");
    replacements.put("hat's", "hat is");
    for (Map.Entry<String, String> entry: replacements.entrySet()) {
        str = str.replaceAll(entry.getKey(), entry.getValue());
    }

如果它只打算使用一次,它确实没有意义,但它可能是可以在许多字符串上重复使用的方法的基础。

答案 2 :(得分:0)

如果您不想一直创建新字符串,则可以使用StringBuilder

    StringBuilder builder = new StringBuilder("We've been doing this for ages. I'm having a difficulty doing this. That's getting confusing.");
    HashMap<String, String> replacements = new HashMap<>();
    replacements.put("'ve", " have");
    replacements.put("'m", " am");
    replacements.put("'s", " is");
    // others...
    for (Map.Entry<String, String> entry: replacements.entrySet()) {
        int index;
        while ((index = builder.indexOf(entry.getKey())) != -1) {
            builder.replace(index, index + entry.getKey().length(), entry.getValue());
        }
    }
    System.out.println(builder);

请注意,如果你试图替换这样的所有收缩,你不太可能100%成功,因为有些短语收缩到相同的收缩,例如:

  

那有 - &gt;那&#39; S   那是 - &gt;也就是说&#39; S

另请注意,有些'表示收缩:

  

玛丽&lt; - 你怎么处理这个?

你可以通过寻找更具体的序列来解决第二个问题,例如That's而不仅仅是's,但对于第一个问题,你需要以某种方式理解上下文。