it-swarm.com.de

Raw Strings in Java - insbesondere für Regex

Gibt es eine Möglichkeit, rohe Zeichenfolgen in Java zu verwenden (ohne Escape-Sequenzen)?

(Ich schreibe eine ganze Menge Regex-Code, und rohe Strings würden meinen Code immens lesbarer machen.)

Ich verstehe, dass die Sprache dies nicht direkt bietet, aber gibt es eine Möglichkeit, sie auf irgendeine Weise zu "simulieren"?

67
PlagueHammer

Nein, das gibt es nicht.

Im Allgemeinen würden Sie rohe Zeichenfolgen und reguläre Ausdrücke in eine Eigenschaftendatei einfügen, aber diese hat auch einige Anforderungen für die Escape-Sequenz.

37
stevedbrown

Dies ist eine Problemumgehung, wenn Sie Eclipse verwenden. Sie können automatisch lange mehrzeilige Textblöcke und Sonderzeichen automatisch mit Escapezeichen versehen, wenn Sie Text in ein String-Literal einfügen 

"-paste hier-"; 

wenn Sie diese Option in window → Voreinstellungen → Java → Editor → Typisierung → "Text beim Einfügen in ein Stringliteral einfügen" aktivieren

46
Dread

Ich benutze Pattern.quote . Und es löst das Problem der Frage. Also:

Pattern pattern = Pattern.compile(Pattern.quote("\r\n?|\n"));

Die Quote-Methode gibt eine Zeichenfolge zurück, die mit dem angegebenen Zeichenfolgenargument übereinstimmt. Die Rückgabezeichenfolge ist die in Anführungszeichen in Anführungszeichen stehende Zeichenfolge.

25
ismailsunni

Nein (ganz traurig).

11
jsight

Halten Sie die Rohtextdatei in Ihrem Klassenpfad und lesen Sie sie mit getResourceAsStream (....) ein.

( Eigenschaftendateien sind üblich, aber unordentlich - ich behandele die meisten Regex als Code und bewahre es auf, wo ich darauf verweisen kann, und Sie sollten es auch tun. Wie für die eigentliche Frage:)

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 Update. Eclipse verfügt über eine Option, mit der Sie Text zwischen Anführungszeichen einfügen können, und die Escape-Sequenzen werden für Sie angewendet. Die Taktik wäre, zuerst die lesbaren Versionen zu bearbeiten und dann den Müll zu löschen und sie zwischen die leeren Anführungszeichen "" einzufügen.


Idee zeit:

Hack deinen Editor um sie zu konvertieren; als Plugin freigeben. Ich habe nach Plugins gesucht, aber keine gefunden (versuchen Sie es doch einmal). Es gibt eine Eins-zu-Eins-Entsprechung zwischen Escape-Quellstrings und Textfeldtext (Rabatt\n,\r\n). Möglicherweise könnte hervorgehobener Text mit zwei Anführungszeichen verwendet werden.

String s = "##########
#####";

dabei steht # für ein beliebiges Zeichen, das hervorgehoben ist - der Bruch wird als Zeilenumbruch behandelt. Text, der innerhalb des hervorgehobenen Bereichs eingegeben oder eingefügt wurde, wird in der "echten" Quelle nicht angezeigt. (Auf dieselbe Weise, wie Eclipse eingefügten Text entgeht, wird der eingegebene Text nicht angezeigt und auch ohne Backslashes angezeigt.) Löschen Sie eines der Anführungszeichen, um einen Syntaxfehler zu verursachen, wenn Sie normal bearbeiten möchten. Hmm.

3
mk.

Hinweis: Ab heute nicht verfügbar. Wahrscheinlich werde ich diese Antwort immer wieder bearbeiten, wenn das Feature veröffentlicht wird. 

Es gibt einen laufenden Vorschlag, Raw Strings in Java einzuführen . Sie sind tatsächlich sehr nützlich in Fällen von Regex. 

Beispiel 1: Eine Zeichenfolge für einen regulären Ausdruck, die als codiert wurde

  System.out.println("this".matches("\\w\\w\\w\\w"));

kann abwechselnd als codiert werden 

System.out.println("this".matches(`\w\w\w\w`));

da Backslashes nicht als besondere Bedeutung interpretiert werden.

Example2: Ein mehrzeiliges String-Literal mit Anhängen in Fremdsprache.

A multiple line string that was coded as 
    String html = "<html>\n" +
                "    <body>\n" +
                "         <p>Hello World.</p>\n" +
                "    </body>\n" +
                "</html>\n";

kann abwechselnd als codiert werden 

 String html = `<html>
                       <body>
                           <p>Hello World.</p>
                       </body>
                   </html>
                  `;

das vermeidet die Notwendigkeit von Zwischenangeboten, Verkettungen und expliziten Zeilenumbrüchen.

Hoffentlich können wir die Veröffentlichung bald erwarten.

3
Suresh Atta

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 entsprechend dem Standard der Plattform konvertiert ist Zeichensatz Was ich damit sage, ist, dass ich denke, dass dies so nahe an "roher" Zeichenfolge ist, wie Sie jemals in Java bekommen können.

2
Esko

Nein. Aber es gibt ein IntelliJ-Plug-In, das den Umgang mit String Manipulation erleichtert.

IntelliJ wird auch automatisch eine eingefügte Zeichenfolge mit Escapezeichen versehen. (Wie @Dread weist auf hin, hat Eclipse ein Plug-In, um dies zu ermöglichen.)

0
Michael Scheper

Sie können einen eigenen, nicht mit Fluchtzeichen versehenen Eigenschaftsleser schreiben und Ihre Zeichenfolgen in eine Ressourcendatei einfügen.

0
ShabbyDoo

Ich persönlich denke an reguläre Ausdrücke und nicht an Code, also mag ich sie nicht in meinem Code - aber mir ist klar, dass dies unpraktisch und unpopulär ist (Ja, das ist mir klar, Sie müssen mich nicht anschreien).

Da es keinen einheimischen Weg gibt, dies zu tun, kann ich zwei Möglichkeiten ausdenken (naja, drei, aber die dritte ist, ähm, unnatürlich).

Meine persönliche Präferenz wäre also, eine Datei in Strings zu parsen. Sie können jeden Eintrag in der Datei benennen und alle in eine Hashtabelle laden, um von Ihrem Code aus leicht darauf zugreifen zu können.

Zweite Wahl: Erstellen Sie eine Datei, die in einer Java-Schnittstelle vorverarbeitet wird. Es könnte dem Regex entkommen, wenn es dies tut. Ich persönlich hasse die Codegenerierung, aber wenn die Java-Datei zu 100% niemals von Menschen bearbeitet wird, ist sie nicht zu schlimm (das eigentliche Übel ist die Erzeugung von Dateien, die Sie bearbeiten müssen!)

Drittens (schwierig und wahrscheinlich eine schlechte Idee): Möglicherweise können Sie ein benutzerdefiniertes Doclet erstellen, das Strings aus Ihren Kommentaren in eine Textdatei oder eine Header-Datei zur Kompilierzeit extrahiert, und dann eine der beiden anderen Methoden verwenden. Dadurch bleiben Ihre Zeichenfolgen in derselben Datei, in der sie verwendet werden. Es könnte wirklich schwierig sein, dies richtig zu machen, und die Strafen des Scheiterns sind extrem, daher würde ich es nicht einmal in Betracht ziehen, wenn ich nicht ein überwältigendes Bedürfnis und ein ziemlich beeindruckendes Talent hätte.

Ich schlage das nur vor, weil Kommentare frei sind und Dinge innerhalb eines "pre" -Tags vor Formatierern und anderen Systemhindernissen ziemlich sicher sind. Das Doclet könnte dies vor dem Drucken der Javadocs extrahieren und könnte sogar einige der generierten Javadocs hinzufügen, die Ihre Verwendung von Regex-Strings anzeigen.

Bevor Sie abstimmen und mir sagen, 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 gesagt habe, ist eine einfache Textdatei ...

0
Bill K