Есть ли в Java способ написать строковый литерал без экранирования кавычек? - PullRequest
104 голосов
/ 14 июня 2010

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

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

foo = '"Hello, World"';

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

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

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

Ответы [ 7 ]

132 голосов
/ 14 июня 2010

Нет, и меня всегда раздражало отсутствие различных строково-литеральных синтаксисов в Java.

Вот трюк, который я использовал время от времени:

String myString = "using `backticks` instead of quotes".replace('`', '"');

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

68 голосов
/ 14 июня 2010

Ответ отрицательный, и доказательство содержится в Спецификации языка 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}".

7 голосов
/ 28 января 2018

Обновление в декабре 2018 года (12 месяцев спустя):

Необработанные строковые литералы (которые есть в янтарном списке ) не попадут в JDK 12.
См. критики здесь .


Возможно, в будущей версии Java (10 или более).

См. JEPS 8196004 с января2018: ( «JEP» - это «Программа расширения JDK» )

Черновик JEP: необработанные строковые литералы

Добавить новый тип литерала, необработанныйстроковый литерал для языка программирования Java.
Как и обычный строковый литерал, необработанный строковый литерал создает строку, но не интерпретирует символьные экранирования и может занимать несколько строк исходного кода .

Так что вместо:

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.

5 голосов
/ 03 сентября 2012

вы также можете использовать StringEscapeUtils от Apache Commons

ОБНОВЛЕНИЕ : Если кого-то интересуют некоторые примеры, вот полезная ссылка: http://java.dzone.com/articles/commons-lang-3-improved-and-powerful-StringEscapeUtils

4 голосов
/ 14 июня 2010

Простой ответ: Нет.

Для более длинных строк, которые необходимо экранировать, я обычно читаю их с какого-то внешнего ресурса.

0 голосов
/ 23 августа 2013

Мне кажется, что работает следующее:

String x = "Some Text" + '"' + "More Text" + '"' + "Even More Text";

Я думаю, что поскольку char является примитивным типом переменной для String, строки и символы могут быть объединены (по крайней мере компилятор eclipse, похоже, не жалуется).

0 голосов
/ 16 июля 2013

Если вы хотите экранировать ' или " в вашей строке, вы можете использовать следующий код:

String text = ...

text = text.replaceAll("('|\")", "\\\\$1");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...