web-dev-qa-db-fra.com

Raw Strings in Java - pour les expressions rationnelles en particulier

Est-il possible d'utiliser des chaînes brutes en Java (sans séquences d'échappement)?

(J'écris pas mal de code regex et des chaînes brutes rendraient mon code infiniment plus lisible)

Je comprends que le langage ne fournit pas cela directement, mais existe-t-il un moyen de les "simuler" de quelque manière que ce soit?

67
PlagueHammer

Non, il n'y en a pas.

En règle générale, vous placeriez des chaînes brutes et des expressions rationnelles dans un fichier de propriétés, mais celles-ci ont également des exigences en matière de séquence d'échappement.

37
stevedbrown

C'est une solution de contournement si vous utilisez Eclipse . Vous pouvez automatiquement avoir de longs blocs de texte correctement multilignés et des caractères spéciaux échappés automatiquement lorsque vous collez du texte dans un littéral 

"-paste here-"; 

si vous activez cette option dans Fenêtre → Préférences → Java → Editeur → Saisie → "Échap du texte lors du collage dans un littéral de chaîne"

46
Dread

J'utilise Pattern.quote . Et cela résout le problème de la question. Ainsi:

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

La méthode quote renvoie une chaîne qui correspond à l'argument fourni, la chaîne renvoyée étant la chaîne correctement citée pour notre cas.

25
ismailsunni

Non (assez tristement).

11
jsight

Ayez le fichier texte brut dans votre chemin de classe et lisez-le avec getResourceAsStream (....)

3

( Les fichiers de propriétés sont communs, mais compliqués - je traite la plupart des regex comme du code et le garde à un endroit où je peux me référer, et vous devriez aussi. Pour ce qui est de la question:)

Oui, il existe des moyens de contourner la mauvaise lisibilité. Vous pourriez essayer:

String s = "crazy escaped garbage"; //readable version//

bien que cela nécessite des précautions lors de la mise à jour. Eclipse a une option qui vous permet de coller du texte entre guillemets et les séquences d'échappement sont appliquées à votre place. La tactique serait d’éditer d’abord les versions lisibles, puis de supprimer les déchets et de les coller entre les guillemets vides "".


Temps d'idée:

Piratez votre éditeur pour les convertir; libérer comme un plugin. J'ai vérifié les plugins, mais n'en ai trouvé aucun (essayez de chercher si). Il existe une correspondance un à un entre les chaînes source échappées et le texte de la zone de texte (\ n,\r\n avec remise). Peut-être pourriez-vous utiliser un texte surligné avec deux guillemets aux extrémités.

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

où # est n'importe quel caractère mis en surbrillance - la pause est traitée comme une nouvelle ligne. Le texte tapé ou collé dans la zone mise en surbrillance est échappé dans la source "réelle" et affiché comme si ce n'était pas le cas. (De la même manière qu'Eclipse échappe le texte collé, cela échapperait au texte saisi et s'afficherait également sans barres obliques inverses.) Supprimez l'un des guillemets pour provoquer une erreur de syntaxe si vous souhaitez modifier normalement. Hmm.

3
mk.

Remarque: à ce jour, non disponible. Je vais probablement modifier cette réponse à chaque fois que la fonctionnalité sera publiée. 

Il y a une proposition en cours pour introduire des chaînes brutes en Java . Ils sont en réalité très utiles dans les cas de regex. 

Exemple 1: Chaîne d'expression régulière codée comme

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

peut être alternativement codé comme 

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

puisque les barres obliques inverses ne sont pas interprétées comme ayant une signification particulière.

Exemple2: Un littéral de plusieurs lignes avec une langue étrangère est ajouté.

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

peut être alternativement codé comme 

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

ce qui évite le besoin de guillemets intermédiaires, de concaténation et de sauts de ligne explicites.

Espérons que nous pouvons espérer la sortie bientôt.

3
Suresh Atta

String # getBytes () expose une copie du tableau d'octets interne contenu dans chaque objet String contenant réellement la chaîne codée UTF-16 16 bits - le tableau d'octets contiendra la même chaîne convertie pour correspondre à la valeur par défaut de la plateforme jeu de caractères. Ce que je dis, c'est que je pense que c'est aussi proche de la chaîne "brute" que vous pouvez obtenir en Java.

2
Esko

Non, mais il existe un plug-in IntelliJ qui facilite cette gestion, appelé String Manipulation .

IntelliJ échappera également automatiquement à une chaîne collée dans celle-ci. (Comme @Dread indique , Eclipse dispose d’un plug-in pour permettre cela.)

0
Michael Scheper

Vous pouvez écrire votre propre lecteur de propriétés non échappé et placer vos chaînes dans un fichier de ressources.

0
ShabbyDoo

Personnellement, je considère les données de chaînes regex et non le code, donc je ne les aime pas dans mon code - mais je me rends compte que ce n'est pas pratique et impopulaire (oui, je m'en rends compte, vous n'avez pas à crier après moi).

Étant donné qu’il n’ya pas de moyen autochtone de le faire, je peux proposer deux possibilités (enfin, trois mais le troisième n’est pas naturel, euh).

Donc, ma préférence personnelle serait de simplement analyser un fichier en chaînes. Vous pouvez nommer chaque entrée du fichier et toutes les charger dans une table de hachage pour un accès facile à partir de votre code.

Deuxième choix, créez un fichier qui sera pré-traité dans une interface Java. il pourrait échapper à la regex comme il le fait. Personnellement, je déteste la génération de code, mais si le fichier Java est à 100% jamais modifié par l'homme, ce n'est pas si mal (le vrai mal, ce sont les fichiers générés que vous êtes censé éditer!)

Troisième (délicat et probablement une mauvaise idée): Vous pourrez peut-être créer un doclet personnalisé qui extraira les chaînes de vos commentaires dans un fichier texte ou un fichier d’en-tête lors de la compilation, puis utiliserez l’une des deux méthodes ci-dessus. Cela conserve vos chaînes dans le même fichier dans lequel elles sont utilisées. Cela pourrait être vraiment difficile à faire correctement, et les pénalités d’échec sont extrêmes, donc je n’y penserais même pas à moins d’avoir un besoin impérieux et un talent assez impressionnant.

Je suggère simplement cela parce que les commentaires sont de forme libre et que les éléments contenus dans une balise "pre" sont assez sûrs des formateurs et des autres systèmes laids. Le doclet pourrait extraire cela avant d'imprimer les javadocs et pourrait même ajouter certains des javadocs générés indiquant votre utilisation des chaînes de regex.

Avant de voter et de me dire que c’était une idée stupide - JE SAIS, je pensais simplement la suggérer, car c’est intéressant, mais ma préférence, comme je l’ai dit plus haut, est un simple fichier texte ...

0
Bill K