我需要转义字符串中存在的字符,但转义字符是转义码的一部分,即。
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
答案 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