Java экранирует символы, которые уже существуют в строке - PullRequest
1 голос
/ 26 сентября 2011

Мне нужно экранировать символы, которые существуют в строке, но экранирующие символы являются частью кода перехода, т. Е.

    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 ]

4 голосов
/ 26 сентября 2011

Я предполагаю, что вам нужно экранировать только один символ за раз.Затем вы можете сделать:

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();
}

Обратите внимание, что если вам действительно не нужно , чтобы иметь динамический характер карты, простой переключатель, вероятно, будет проще и эффективнее.

0 голосов
/ 26 сентября 2011

Во-первых, если вам нужен порядок на карте, используйте LinkedHashMap. Во-вторых, вы даже можете решить все без карт вообще, но используя регулярные выражения с предвкушением. Смотри http://download.oracle.com/javase/6/docs/api/java/util/regex/Pattern.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...