Java转义已存在于字符串中的字符

时间:2011-09-26 16:40:13

标签: java escaping decimal

我需要转义字符串中存在的字符,但转义字符是转义码的一部分,即。

    Map<String, String> escapeChars = new HashMap<String, String>();
        escapeChars.put("^", "^94;");
        escapeChars.put("%", "^37;");
        escapeChars.put("'", "^39;");

    public String findEscapeChars(String x) {
    for(Map.Entry<String, String> entry : escapeChars.entrySet()) {
        if(x.contains(entry.getKey()) ) {   
            x = x.replaceAll(entry.getKey(), entry.getValue());
        }
    }
    return x;
    }

    //result should match
    assertEquals("^37;", findEscapeChars("%")); //example of the caret symbol escaping
    assertEquals("^37; 1 2 ^39; ^94; 4 ^37;", findEscapeChars("% 1 2 ' ^ 4 %"));

它确实需要在一个循环中完成,只有一个条件。问题是哈希映射不按特定顺序遍历,因此插入符号可以尝试在字符串中自行转义。没有很多循环似乎很棘手,如果条件,一个简单的解决方案将是理想的。

由于 d

2 个答案:

答案 0 :(得分:4)

我假设你一次只需要逃避一个字符。然后你可以这样做:

public String findEscapeChars(String original) {
    StringBuilder builder = new StringBuilder();
    for (int i = 0; i < original.length(); i++)
    {
        char c = original.charAt(i);
        String escaped = escapeMap.get(c);
        if (escaped != null)
        {
            builder.append(escaped);
        }
        else
        {
            builder.append(c);
        }
    }
    return builder.toString();
}

请注意,除非您确实需要具有地图的动态特性,否则简单的切换可能会更简单,更有效。

答案 1 :(得分:0)

首先,如果您需要在地图中使用LinkedHashMap代替。其次,你甚至可以在没有地图的情况下解决所有问题,但使用前瞻性的常规训练。见http://download.oracle.com/javase/6/docs/api/java/util/regex/Pattern.html