【问题标题】:How to replace specific characters with corresponding characters in java? [duplicate]如何用java中的相应字符替换特定字符? [复制]
【发布时间】:2017-09-10 02:24:58
【问题描述】:

我想做这样的事情:将所有ck 替换为k,将所有dd 替换为wr,将所有f 替换为m,以及另外10 个这样的替换。 我可以用replace("ck","k").replace("dd","wr")等等来做到这一点,但它接缝很傻而且很慢。 java中是否有任何函数可以做这样的事情? 例如replace(string,stringArray1, stringArray2);

【问题讨论】:

标签: java string replace


【解决方案1】:

使用appendReplacement 循环。

这是一种通用的方法:

private static String replace(String input, Map<String, String> mappings) {
    StringBuffer buf = new StringBuffer();
    Matcher m = Pattern.compile(toRegex(mappings.keySet())).matcher(input);
    while (m.find())
        m.appendReplacement(buf, Matcher.quoteReplacement(mappings.get(m.group())));
    return m.appendTail(buf).toString();
}
private static String toRegex(Collection<String> keys) {
    return keys.stream().map(Pattern::quote).collect(Collectors.joining("|"));
}

如果您不使用 Java 8+,则第二种方法是:

private static String toRegex(Collection<String> keys) {
    StringBuilder regex = new StringBuilder();
    for (String key : keys) {
        if (regex.length() != 0)
            regex.append("|");
        regex.append(Pattern.quote(key));
    }
    return regex.toString();
}

测试代码

Map<String, String> mappings = new HashMap<>();
mappings.put("ck","k");
mappings.put("dd","wr");
mappings.put("f", "m");
System.out.println(replace("odd flock", mappings)); // prints: owr mlok

查看IDEONE 了解运行版本。

【讨论】:

    【解决方案2】:
    Map<String, String> replacementMap = new HashMap<String, String>();
    replacementMap.put("ck", "k");
    replacementMap.put("dd", "wr");
    replacementMap.put("f", "m");
    // ...
    
    String resultStr = "Abck fdddk wr fmck"; // whatever string to process
    StringBuilder builder = new StringBuilder(resultStr); // wrap it in builder
    
    Iterator<String> iterator = replacementMap.keySet().iterator();
    while (iterator.hasNext()) {
        String strToReplace = iterator.next();
        replaceAll(builder, strToReplace, replacementMap.get(strToReplace));
    }
    System.out.println("Result is: " + builder.toString());
    
    public static void replaceAll(StringBuilder builder, String from, String to) {
        int index = builder.indexOf(from);
        while (index != -1) {
            builder.replace(index, index + from.length(), to);
            index += to.length(); // Move to the end of the replacement
            index = builder.indexOf(from, index);
        }
    }
    

    replaceAll() 方法是从这个Jon Skeet's answer借来的

    在他的示例中替换replaceAll() 是使用apache commons 库,有StrBuilder 类提供replaceAll() 方法。见this answer

    【讨论】:

      猜你喜欢
      • 2012-07-20
      • 2022-08-07
      • 1970-01-01
      • 1970-01-01
      • 2016-11-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多