Представление символа в строку - PullRequest
1 голос
/ 23 января 2010

Мне нужно найти специальные escape-символы java (\ n, \ t, \ b и т. Д.) В группе строк, а затем распечатать, какие строки содержат какие специальные символы. Таким образом, при печати я хотел бы изменить само значение char строкой "\ n" для "\ n", "\ t" для "\ t" и так далее. Я сделал с оператором switch для всех символов этого типа. Интересно, есть ли решение, которое не включает проверку каждого из ???

Ответы [ 7 ]

1 голос
/ 23 января 2010

Другой подход, использующий карту для определения замены и метод StringBuilder.replace для фактического выполнения замены, выглядит немного более компактным, и я думаю, что это не далеко от версии коммутатора по производительности, но, безусловно, использует немного больше памяти .

public class Unescape {

    private static final Map<Character, String> replacements = new HashMap<Character, String>(){{
        put('\n',"\\n"); put('\r',"\\r"); put('\t',"\\t"); put('\b',"\\b"); //etc
    }};

    public static String unescape(String s) {
        String replace;
        StringBuilder result = new StringBuilder(s);
        for (int i=0; i < result.length(); i++) {
            replace = replacements.get(result.charAt(i));
            if (replace!=null) result.replace(i, i+1, replace);
        }
        return result.toString();
    }

    public static void main(String[] args) {

        System.out.println(unescape("hi\nthere\t\t\tHow are u?"));

    }

}

выход образца

привет \ t \ t \ t \ tКак ты?

1 голос
/ 23 января 2010

В конце концов, независимо от того, какой метод используется, нужно будет что-то посмотреть на каждый символ в строке. Вы можете сделать это явно в цикле, как вы сейчас делаете, или с помощью цепочки набора вызовов replace (). Но, хотя на бумаге они могут выглядеть короче, они могут занять больше времени.

Для этого используйте replace():

"\ttest\n\n".replace("\t", "\\t").replace("\n", "\\n")/*…*/;

Чтобы сделать это в цикле, посмотрите на ответ от Andreas_D .

Обратите внимание, что метод replace(), хотя и короче на бумаге, почти наверняка займет больше времени для запуска, так как для замены каждой escape-последовательности он должен повторяться по всей строке 8 раз, тогда как для ручного цикла требуется только сделать это один раз.

Редактировать : Первоначально я думал, что вы, вероятно, могли бы сделать это с помощью магического регулярного выражения, однако вы не можете выполнить условное замещение в регулярном выражении, что означает, что вы можете сделать только эквивалент показанных вызовов замены. выше. Учитывая, что в этом случае регулярные выражения будут немного медленнее, я не думаю, что это хорошее решение.

1 голос
/ 23 января 2010

Я не нашел библиотеки для этого, но, с другой стороны, моя быстрая реализация выглядит не слишком ужасно - я бы предпочел это даже RegExp;)

public String unescape(String s) {
    StringBuilder result = new StringBuilder();
    for (char c : s.toCharArray()) {
        result.append(toLiteral(c));
    }
    return result.toString();
}

private String toLiteral(char c) {
    switch (c) {
    case '\n':
        return "\\n";
    case '\t':
        return "\\t";
    case '\r':
        return "\\r";
    case '\f':
        return "\\f";
    case '\b':
        return "\\b";
    case '\'':
        return "\\\'";
    case '\"':
        return "\\\"";
    case '\\':
        return "\\\\";
    default:
        return c;
    }
}

Согласно моему компилятору, все тезисы - это escape-последовательности, разрешенные для строк.

1 голос
/ 23 января 2010

Хм, я не думаю, что регулярные выражения позволят вам сделать эту замену в одной строке, даже с обратными ссылками. Проблема заключается в том, что все символы специального перевода отображаются на «\ n» и т. Д. Для всех специальных символов.

Конечно, вы можете сделать это с помощью серии вызовов replace (), по одному для каждого символа, но вы пытаетесь избежать этого.

Вам нужен эквивалент команды 'tr' в Unix, и я сожалею, что не знаю такого метода.

0 голосов
0 голосов
/ 28 ноября 2010

Если вы ищете что-то немного более интересное, вы можете посмотреть на этот ответ .

0 голосов
/ 23 января 2010

Вы можете использовать регулярные выражения:

String.replaceAll

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