В Java существует ли способ написать строковый литерал без необходимости скрывать кавычки?
Скажем, у вас есть строковый литерал с большим количеством кавычек внутри него. Вы могли бы избежать их всех, но это боль и трудно читать.
На некоторых языках вы можете просто сделать это:
foo = '"Hello, World"';
В Java, однако, ''
используется для char
s, поэтому вы не можете использовать его для String
таким образом. Некоторые языки имеют синтаксис, чтобы обойти это. Например, в python вы можете сделать это:
"""A pretty "convenient" string"""
Есть ли у Java что-то подобное?
Ответы
Ответ 1
Ответ - нет, и доказательство находится в Спецификации языка Java:
StringLiteral:
"StringCharacters"
StringCharacters:
StringCharacter
| StringCharacters StringCharacter
StringCharacter:
InputCharacter but not " or \
| EscapeSequence
Как вы можете видеть, StringLiteral
может быть просто привязана "
и не может содержать специальный символ без экранов.
Замечание: вы можете встроить Groovy в свой проект, это расширит синтаксис Java, позволяя использовать '''multi line string '''
, ' "string with single quotes" '
, а также "string with ${variable}"
.
Ответ 2
Нет, и меня всегда раздражало отсутствие в Java разных синтаксисов строкового литерала.
Вот трюк, который я использовал время от времени:
String myString = "using `backticks` instead of quotes".replace('`', '"');
В основном я делаю что-то подобное для статического поля. Так как он статический, код замены строки вызывается один раз, после инициализации класса. Таким образом, ограничение производительности во время выполнения практически отсутствует, и это делает код значительно более разборчивым.
Ответ 3
вы также можете использовать StringEscapeUtils от apache commons
UPDATE. Если кто-то заинтересован в некоторых примерах, здесь есть полезная ссылка: http://java.dzone.com/articles/commons-lang-3-improved-and-powerful-StringEscapeUtils
Ответ 4
Простой ответ: Нет.
Для более длинных строк, которые должны быть экранированы, я обычно читаю их с некоторого внешнего ресурса.
Ответ 5
Возможно, в будущей версии Java (10 или более).
См. JEPS 8196004 с января 2018 года: ( "JEP" это "Программа повышения JDK" )
JEP draft: Литералы сырой строки
Добавьте новый тип литерала, строковый литерал, на язык программирования Java.
Как и в традиционном строковом литерале, строковый литерал строит строку, но не интерпретирует escape-строки строки и может охватывать несколько строк исходного кода.
Итак, вместо:
Runtime.getRuntime().exec("\"C:\\Program Files\\foo\" bar");
String html = "<html>\n"
" <body>\n" +
" <p>Hello World.</p>\n" +
" </body>\n" +
"</html>\n";
System.out.println("this".matches("\\w\\w\\w\\w"));
Вы могли бы ввести:
Runtime.getRuntime().exec(`"C:\Program Files\foo" bar"`);
String html = `<html>
<body>
<p>Hello World.</p>
</body>
</html>
`;
System.out.println("this".matches(`\w\w\w\w`));
Ухоженная!
Но по-прежнему просто проект: ему нужно будет опубликовать, представить, быть кандидатом и финансироваться до его завершения и превратив его в следующий JDK.
Ответ 6
Если вы хотите избежать '
или "
в своей строке, вы можете использовать следующий код:
String text = ...
text = text.replaceAll("('|\")", "\\\\$1");
Ответ 7
Мне кажется, что работает следующее:
String x = "Some Text" + '"' + "More Text" + '"' + "Even More Text";
Я думаю, потому что char - это примитивный тип переменной для String, строки и символы могут быть объединены (по крайней мере компилятор eclipse, похоже, не жалуется).