web-dev-qa-db-fra.com

En Java, existe-t-il un moyen d'écrire un littéral de chaîne sans avoir à échapper des guillemets?

Supposons que vous avez un littéral String avec beaucoup de guillemets à l'intérieur. Vous pourriez y échapper, mais c'est pénible et difficile à lire.

Dans certaines langues, vous pouvez simplement faire ceci:

foo = '"Hello, World"';

En Java, cependant, '' est utilisé pour chars, vous ne pouvez donc pas l'utiliser pour Strings de cette façon. Certaines langues ont une syntaxe pour contourner ce problème. Par exemple, en python, vous pouvez faire ceci:

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

Est-ce que Java a quelque chose de similaire?

104
Matthew

La réponse est non, et la preuve réside dans la spécification du langage Java :

  StringLiteral:
   "StringCharacters"

  StringCharacters:
   StringCharacter
   | StringCharacters StringCharacter

  StringCharacter:
   InputCharacter but not " or \
   | EscapeSequence

Comme vous pouvez le voir, un StringLiteral peut simplement être lié par " et ne peut pas contenir de caractère spécial sans échappées.

Une note de côté: vous pouvez intégrer Groovy à l'intérieur de votre projet, cela étendra la syntaxe de Java vous permettant d'utiliser '''multi line string ''', ' "string with single quotes" ' et aussi "string with ${variable}".

70
Jack

Non, et j'ai toujours été ennuyé par l'absence de différentes syntaxes littérales de chaîne en Java.

Voici un truc que j'ai utilisé de temps en temps:

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

Je fais principalement quelque chose comme ça pour un champ statique. Comme il est statique, le code de remplacement de chaîne est appelé une fois, lors de l'initialisation de la classe. La pénalité de performance d'exécution est pratiquement inexistante et rend le code considérablement plus lisible.

133
benjismith

Mise à jour en décembre 2018 (12 mois plus tard):

Les littéraux de chaîne bruts (qui figurent sur la liste liste orange ) ne parviendront pas à JDK 12.
Voir le critiques ici .


Il pourrait y avoir dans une future version de Java (10 ou plus)).

Voir JEPS 8196004 à partir de janvier 2018: ( "JEP" est le "programme d'amélioration du JDK" )

Projet PEC: littéraux de chaîne bruts

Ajoutez un nouveau type de littéral, un littéral de chaîne brute, au langage de programmation Java.
Comme le littéral de chaîne traditionnel, un littéral de chaîne brute produit une chaîne, mais n'interprète pas les échappements de chaîne et peut s'étendre sur plusieurs lignes de code source .

Donc au lieu de:

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"));

Vous seriez capable de taper:

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`));

Soigné!

Mais il est toujours juste un brouillon : il devra être posté, soumis, être candidat et financé avant d’être complété et d’être intégré dans le prochain JDK.

8
VonC

vous pouvez également utiliser StringEscapeUtils de Apache commons

[~ # ~] update [~ # ~] : Si quelqu'un est intéressé par certains exemples, voici un lien utile: http://Java.dzone.com/articles/commons-lang-3-improved-and-powerful-StringEscapeUtils

5
Doua Beri

Réponse simple: non.

Pour les chaînes plus longues à échapper, je les lis généralement à partir d'une ressource externe.

4
Chris Lercher