Подтвердить что ты не робот

В Java существует ли способ написать строковый литерал без необходимости скрывать кавычки?

Скажем, у вас есть строковый литерал с большим количеством кавычек внутри него. Вы могли бы избежать их всех, но это боль и трудно читать.

На некоторых языках вы можете просто сделать это:

foo = '"Hello, World"';

В Java, однако, '' используется для char s, поэтому вы не можете использовать его для String таким образом. Некоторые языки имеют синтаксис, чтобы обойти это. Например, в python вы можете сделать это:

"""A pretty "convenient" string"""

Есть ли у Java что-то подобное?

4b9b3361

Ответ 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('`', '"');

В основном я делаю что-то подобное для статического поля. Так как он статический, код замены строки вызывается один раз, после инициализации класса. Таким образом, ограничение производительности во время выполнения практически отсутствует, и это делает код значительно более разборчивым.

Ответ 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, похоже, не жалуется).