Gibt es eine Möglichkeit, rohe Zeichenfolgen in Java zu verwenden (ohne Escape-Sequenzen)?
(Ich schreibe eine ganze Menge Regex-Code und rohe Zeichenfolgen würden meinen Code immens lesbarer machen.)
Ich verstehe, dass die Sprache dies nicht direkt bereitstellt, aber gibt es eine Möglichkeit, sie auf irgendeine Weise zu "simulieren"?
Antworten:
Ja .
Textblöcke kommen nach Java
Java 13 liefert lang erwartete mehrzeilige Zeichenfolgen
Etwas Geschichte: Raw String Literals wurden zurückgezogen . Dies sollte eine Vorschau-Sprachfunktion in JDK 12 sein, wurde jedoch zurückgezogen und in JDK 12 nicht angezeigt. Sie wurde in JDK 13 durch Textblöcke (JEP 355) ersetzt.
Sie können Textblöcke verwenden, um mühelos mehrzeilige Zeichenfolgenliterale zu definieren. Sie müssen nicht die visuelle Unordnung hinzufügen, die mit regulären String-Literalen einhergeht: Verkettungsoperatoren und Escape-Sequenzen. Sie können auch steuern, wie die Zeichenfolgenwerte formatiert werden. Schauen wir uns zum Beispiel das folgende HTML-Snippet an:
String html = """ <HTML> <BODY> <H1>"Java 13 is here!"</H1> </BODY> </HTML>""";
Beachten Sie die drei Anführungszeichen , die den Anfang und das Ende des Blocks begrenzen.
quelle
Dies ist eine Problemumgehung, wenn Sie Eclipse verwenden. Sie können lange Textblöcke automatisch korrekt mehrzeilig und Sonderzeichen automatisch maskieren lassen, wenn Sie Text in ein Zeichenfolgenliteral einfügen
"-paste here-";
Wenn Sie diese Option in Fenster → Einstellungen → Java → Editor → Eingabe → "Escape-Text beim Einfügen in ein Zeichenfolgenliteral" aktivieren.
quelle
Nein, gibt es nicht.
Im Allgemeinen würden Sie rohe Zeichenfolgen und reguläre Ausdrücke in eine Eigenschaftendatei einfügen, für diese gelten jedoch auch einige Anforderungen an die Escape-Sequenz.
quelle
Ich benutze Pattern.quote . Und es löst das Problem der Frage. Also:
Pattern pattern = Pattern.compile(Pattern.quote("\r\n?|\n"));
Die Anführungszeichenmethode gibt eine Zeichenfolge zurück, die mit dem angegebenen Zeichenfolgenargument übereinstimmt. Die Rückgabezeichenfolge ist die in Anführungszeichen stehende Zeichenfolge für unseren Fall.
quelle
"\."
.Pattern.quote
Dies wäre auch dann erforderlich, wenn Java unformatierte Zeichenfolgenliterale hätte: Zeichen wie.
und+
erfordern keine spezielle Behandlung in Java-Zeichenfolgenliteralen, müssen jedoch für reguläre Ausdrücke maskiert werden. Python unterstützt rohe String-Literale, hat es aber immer nochre.escape
.\*
. Das Fehlen von Rohzeichenfolgen in Java verbindet das Konzept der Erstellung eines Regex-Musters mit Sonderzeichen, die als Literale behandelt werden, und das Konzept der Erstellung von Zeichenfolgendaten mit Sonderzeichen. Dies sind separate Konzepte .foo("\\[")
kann manfoo("[")
glücklich sein.Nein (ziemlich traurig).
quelle
Haben Sie die Rohtextdatei in Ihrem Klassenpfad und lesen Sie sie mit getResourceAsStream (....) ein.
quelle
( Eigenschaftendateien sind häufig, aber chaotisch - ich behandle die meisten regulären Ausdrücke als Code und behalte sie dort, wo ich darauf verweisen kann, und Sie sollten es auch. Was die eigentliche Frage betrifft :)
Ja, es gibt Möglichkeiten, die schlechte Lesbarkeit zu umgehen. Sie könnten versuchen:
String s = "crazy escaped garbage"; //readable version//
Dies erfordert jedoch Vorsicht beim Aktualisieren. Eclipse verfügt über eine Option, mit der Sie Text zwischen Anführungszeichen einfügen und die Escape-Sequenzen für Sie anwenden können. Die Taktik wäre, zuerst die lesbaren Versionen zu bearbeiten, dann den Müll zu löschen und sie zwischen die leeren Anführungszeichen "" einzufügen.
Ideenzeit:
Hacken Sie Ihren Editor, um sie zu konvertieren. als Plugin veröffentlichen. Ich habe nach Plugins gesucht, aber keine gefunden (versuchen Sie es trotzdem). Es gibt eine Eins-zu-Eins-Entsprechung zwischen maskierten Quellzeichenfolgen und Textfeldtext (Rabatt \ n, \ r \ n). Möglicherweise könnte hervorgehobener Text mit zwei Anführungszeichen an den Enden verwendet werden.
String s = "########## #####";
Dabei ist # ein beliebiges Zeichen, das hervorgehoben ist. Die Unterbrechung wird als neue Zeile behandelt. Innerhalb des hervorgehobenen Bereichs eingegebener oder eingefügter Text wird in der "echten" Quelle maskiert und so angezeigt, als ob dies nicht der Fall wäre. (Auf die gleiche Weise, wie Eclipse eingefügten Text maskiert, wird typisierter Text maskiert und auch ohne umgekehrte Schrägstriche angezeigt.) Löschen Sie eines der Anführungszeichen, um einen Syntaxfehler zu verursachen, wenn Sie normal bearbeiten möchten. Hmm.
quelle
Hinweis: Ab heute nicht verfügbar. Wahrscheinlich werde ich diese Antwort bei jeder Veröffentlichung der Funktion erneut bearbeiten.
Es gibt einen laufenden Vorschlag zur Einführung von Raw Strings in Java . Sie sind tatsächlich sehr nützlich bei Regex.
Beispiel 1: Eine Zeichenfolge mit regulären Ausdrücken, die als codiert wurde
System.out.println("this".matches("\\w\\w\\w\\w"));
kann alternativ als codiert werden
System.out.println("this".matches(`\w\w\w\w`));
da Backslashes nicht als besonders bedeutsam interpretiert werden.
Beispiel 2: Ein mehrzeiliges String-Literal mit Fremdsprache wird angehängt.
A multiple line string that was coded as String html = "<html>\n" + " <body>\n" + " <p>Hello World.</p>\n" + " </body>\n" + "</html>\n";
kann alternativ als codiert werden
Dadurch werden Zwischenzitate, Verkettungen und explizite Zeilenumbrüche vermieden.
Hoffentlich können wir die Veröffentlichung bald erwarten.
quelle
String # getBytes () macht eine Kopie des internen Byte-Arrays verfügbar, das in jedem einzelnen String-Objekt enthalten ist, das tatsächlich den 16-Bit-UTF-16-codierten String enthält. Das Byte-Array enthält denselben String, der so konvertiert wurde, dass er mit dem Standardzeichensatz der Plattform übereinstimmt. Was ich damit sagen will ist, dass ich denke, dass dies so nahe an der "rohen" Zeichenfolge liegt, wie Sie es jemals in Java bekommen können.
quelle
Sie können Ihren eigenen, nicht maskierten Eigenschaftsleser schreiben und Ihre Zeichenfolgen in eine Ressourcendatei einfügen.
quelle
Ich persönlich betrachte Regex-Strings als Daten und nicht als Code, daher mag ich sie in meinem Code nicht - aber mir ist klar, dass dies unpraktisch und unbeliebt ist (Ja, mir ist klar, dass Sie mich nicht anschreien müssen).
Da es keinen nativen Weg gibt, dies zu tun, kann ich mir zwei Möglichkeiten einfallen lassen (nun, drei, aber die dritte ist, ähm, unnatürlich).
Meine persönliche Präferenz wäre es also, eine Datei einfach in Strings zu analysieren. Sie können jeden Eintrag in der Datei benennen und alle in eine Hash-Tabelle laden, um von Ihrem Code aus leicht darauf zugreifen zu können.
Zweite Wahl: Erstellen Sie eine Datei, die in einer Java-Oberfläche vorverarbeitet wird. es könnte dabei der Regex entkommen. Persönlich hasse ich die Codegenerierung, aber wenn die Java-Datei zu 100% nie von Menschen bearbeitet wurde, ist sie nicht schlecht (das wahre Übel sind generierte Dateien, die Sie voraussichtlich bearbeiten werden!).
Drittens (knifflig und wahrscheinlich eine schlechte Idee): Möglicherweise können Sie ein benutzerdefiniertes Doclet erstellen, das beim Kompilieren Zeichenfolgen aus Ihren Kommentaren in eine Textdatei oder eine Headerdatei extrahiert, und dann eine der beiden oben genannten Methoden verwenden. Dadurch bleiben Ihre Zeichenfolgen in derselben Datei, in der sie verwendet werden. Dies könnte sehr schwer richtig zu machen sein, und die Strafen für Misserfolge sind extrem, so dass ich es nicht einmal in Betracht ziehen würde, wenn ich nicht ein überwältigendes Bedürfnis und ein ziemlich beeindruckendes Talent hätte.
Ich schlage dies nur vor, weil Kommentare frei formuliert sind und Dinge innerhalb eines "Pre" -Tags ziemlich sicher vor Formatierern und anderen hässlichen Systemen sind. Das Doclet könnte dies extrahieren, bevor die Javadocs gedruckt werden, und sogar einige der generierten Javadocs hinzufügen, die auf Ihre Verwendung von Regex-Zeichenfolgen hinweisen.
Bevor ich abstimme und mir sage, dass dies eine dumme Idee ist - ich weiß, ich dachte nur, ich würde es vorschlagen, weil es interessant ist, aber meine Präferenz, wie ich oben sagte, ist eine einfache Textdatei ...
quelle
Nein. Es gibt jedoch ein IntelliJ-Plug-In namens String Manipulation , mit dem dies einfacher zu handhaben ist .
IntelliJ entkommt auch automatisch einem eingefügten String. (Wie @Dread hervorhebt , verfügt Eclipse über ein Plug-In, um dies zu ermöglichen.)
quelle