Как бы вы преобразовали строку в строковый литерал Java? - PullRequest
10 голосов
/ 16 марта 2010

Это своего рода Java-аналог этого вопроса о C # .

Предположим, у меня есть String объект, который я хочу представить в коде, и я хочу создать строковый литерал, который отображается на одну и ту же вещь.

Пример

hello, "world"
goodbye

становится

hello, \"world\"\ngoodbye

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

Ответы [ 2 ]

6 голосов
/ 16 марта 2010

Если вы можете добавить внешний код, у Apache's Commons Lang есть <a href="http://commons.apache.org/proper/commons-lang/apidocs/org/apache/commons/lang3/StringEscapeUtils.html" rel="nofollow noreferrer">EscapeStringUtils.escapeJava()</a>, который, я думаю, делает именно то, что вы хотите.

4 голосов
/ 16 марта 2010

Моя реализация наивного конечного автомата выглядит следующим образом:

public String javaStringLiteral(String str)
{
    StringBuilder sb = new StringBuilder("\"");
    for (int i=0; i<str.length(); i++)
    {
        char c = str.charAt(i);
        if (c == '\n')
        {
            sb.append("\\n");
        }
        else if (c == '\r')
        {
            sb.append("\\r");
        }
        else if (c == '"')
        {
            sb.append("\\\"");
        }
        else if (c == '\\')
        {
            sb.append("\\\\");
        }
        else if (c < 0x20)
        {
            sb.append(String.format("\\%03o", (int)c));
        }
        else if (c >= 0x80)
        {
            sb.append(String.format("\\u%04x", (int)c));
        }
        else
        {               
            sb.append(c);
        }
    }
    sb.append("\"");
    return sb.toString();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...