it-swarm.com.de

Gibt es in Java eine Möglichkeit, ein String-Literal zu schreiben, ohne Anführungszeichen zu umgehen?

Angenommen, Sie haben ein String-Literal mit vielen Anführungszeichen. Sie könnten ihnen allen entkommen, aber es ist ein Schmerz und schwer zu lesen.

In einigen Sprachen können Sie dies einfach tun:

foo = '"Hello, World"';

In Java jedoch '' wird für chars verwendet, daher können Sie es auf diese Weise nicht für Strings verwenden. Einige Sprachen haben eine Syntax, um dies zu umgehen. In Python können Sie beispielsweise Folgendes tun:

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

Hat Java etwas ähnliches?

104
Matthew

Die Antwort ist nein und der Beweis befindet sich in der Java-Sprachspezifikation :

  StringLiteral:
   "StringCharacters"

  StringCharacters:
   StringCharacter
   | StringCharacters StringCharacter

  StringCharacter:
   InputCharacter but not " or \
   | EscapeSequence

Wie Sie sehen, kann ein StringLiteral nur durch " Gebunden werden und darf keine Sonderzeichen ohne Escapezeichen enthalten.

Eine Randnotiz: Sie können Groovy in Ihr Projekt einbetten. Dadurch wird die Syntax von Java) erweitert, sodass Sie '''multi line string ''', ' "string with single quotes" ' und auch "string with ${variable}".

70
Jack

Nein, und ich habe mich immer über das Fehlen unterschiedlicher String-Literal-Syntaxen in Java geärgert.

Hier ist ein Trick, den ich von Zeit zu Zeit benutzt habe:

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

Ich mache sowas hauptsächlich nur für ein statisches Feld. Da es sich um einen statischen Code handelt, wird der Code zum Ersetzen von Zeichenfolgen bei der Initialisierung der Klasse einmal aufgerufen. Die Laufzeit-Performance-Beeinträchtigung ist also praktisch nicht vorhanden und macht den Code erheblich lesbarer.

133
benjismith

Update Dezember 2018 (12 Monate später):

Rohe String-Literale (die auf der gelben Liste stehen) schaffen es nicht bis JDK 12.
Siehe Kritik hier .


Möglicherweise wird es in einer zukünftigen Version von Java (10 oder mehr) geben.

Siehe JEPS 8196004 ab Januar 2018: ( "JEP" ist das "JDK Enhancement Program" )

JEP-Entwurf: Raw String Literals

Fügen Sie der Programmiersprache Java) eine neue Art von Literal hinzu, ein unformatiertes Zeichenfolgenliteral.
Wie das traditionelle String-Literal erzeugt ein unformatiertes String-Literal einen String, aber interpretiert keine String-Escapes und kann mehrere Quellcodezeilen umfassen .

Also statt:

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

Sie können Folgendes eingeben:

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

Ordentlich!

Aber es ist immer noch nur ein Entwurf : Es muss gepostet, eingereicht, ein Kandidat sein und finanziert werden, bevor es fertiggestellt und in das nächste JDK aufgenommen werden kann.

8
VonC

sie können auch StringEscapeUtils aus Apache-Commons verwenden

[~ # ~] Update [~ # ~] : Wenn jemand an einigen Beispielen interessiert ist, ist hier ein nützlicher Link: http://Java.dzone.com/articles/commons-lang-3-improved-and-powerful-StringEscapeUtils

5
Doua Beri

Einfache Antwort: Nein.

Für längere Zeichenfolgen, die maskiert werden müssen, lese ich sie normalerweise von einer externen Ressource.

4
Chris Lercher