Raw Ssortingngs in Java – pour regex 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 les chaînes brutes rendraient mon code beaucoup plus lisible)

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

Non, il n’y en a pas.

Généralement, vous placeriez des chaînes brutes et des expressions rationnelles dans un fichier de propriétés, mais celles-ci ont également des exigences de séquence d’échappement.

Ceci est un remède si vous utilisez éclipse. Vous pouvez automatiquement avoir de longs blocs de texte correctement multilignes et les caractères spéciaux sont automatiquement échappés lorsque vous collez du texte dans un littéral de chaîne

“-paste ici-“;

Si vous activez cette option dans la fenêtre → préférences → Java → Éditeur → Taper → “Échap du texte lors du collage dans un littéral de chaîne”

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

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

La méthode quote renvoie une chaîne qui correspond à l’argument de chaîne fourni, dont la chaîne de retour est la chaîne correctement citée pour notre cas.

Non (sortingstement)

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

(Les fichiers de propriétés sont communs, mais compliqués – je traite la plupart des regex comme du code, et conservez-les là où je peux me référer, et vous devriez aussi. Comme pour la question réelle:)

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

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

bien que cela nécessite des soins 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 pour vous. La tactique consisterait à modifier les versions lisibles en premier, puis à supprimer les déchets et à les coller entre les guillemets vides “”.


Temps d’idée:

Hack votre éditeur pour les convertir; sortie en tant que plugin. J’ai vérifié les plugins, mais je n’ai trouvé aucun (essayez de chercher si). Il y a une correspondance un à un entre les chaînes source échappées et le texte de la zone de texte (actualisation de \ n, \ r \ n). Peut-être que le texte mis en évidence avec deux guillemets aux extrémités pourrait être utilisé.

 Ssortingng s = "########## #####"; 

où # est un caractère quelconque qui est mis en évidence – la rupture est traitée comme une nouvelle ligne. Le texte saisi ou collé dans la zone en surbrillance est échappé dans la source «réelle» et affiché comme s’il ne l’était pas. (De la même manière qu’Eclipse échappe au texte collé, cela échapperait au texte tapé et l’afficherait également sans les barres obliques inverses.) Supprimez l’un des guillemets pour provoquer une erreur de syntaxe si vous souhaitez l’éditer normalement. Hmm.

Ssortingng # getBytes () expose une copie du tableau d’octets interne contenu dans chaque object Ssortingng unique qui contient réellement la chaîne codée UTF-16 16 bits – le tableau d’octets contient la même chaîne convertie pour correspondre au jeu de caractères par défaut de la plate-forme. Ce que je dis, c’est que je pense que c’est aussi proche de la chaîne “brute” que vous ne pouvez jamais obtenir en Java.

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

Il existe une proposition en cours pour introduire les chaînes brutes en Java . Ils sont en fait très utiles dans les cas de regex.

Exemple 1: une 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`)); 

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

Example2: Un littéral de chaîne multi-lignes avec une langue étrangère s’ajoute.

 A multiple line ssortingng that was coded as Ssortingng html = "\n" + " \n" + " 

Hello World.

\n" + " \n" + "\n";

peut être alternativement codé comme

  Ssortingng html = `  

Hello World.

`;

ce qui évite le besoin de citations intermédiaires, de concaténation et de nouvelles lignes explicites.

J’espère que nous pouvons nous attendre à la sortie bientôt.

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

Personnellement, je considère les données des chaînes de regex et non du 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 le réalise, vous n’avez pas à me crier dessus).

Etant donné qu’il n’y a pas de manière native de faire cela, je peux proposer deux possibilités (enfin, trois mais la troisième est, euh, pas naturelle).

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

Deuxième choix, créer 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 n’est jamais édité à 100%, ce n’est pas trop grave (le vrai mal est de générer des fichiers que vous êtes censé modifier!)

Troisièmement (difficile et probablement une mauvaise idée): Vous pourriez créer un doclet personnalisé qui extraira des chaînes de vos commentaires dans un fichier texte ou un fichier d’en-tête au moment de la compilation, puis utilisez l’une des deux autres méthodes ci-dessus. Cela garde vos chaînes dans le même fichier dans lequel elles sont utilisées. Cela pourrait être très difficile à faire correctement, et les pénalités d’échec sont extrêmes, donc je ne le prendrais même pas à moins d’un besoin énorme et d’un talent impressionnant.

Je suggère ceci seulement parce que les commentaires sont de forme libre et les choses dans un “pre” tag sont assez sûres des formateurs et d’autres systèmes vides. Le doclet pourrait extraire ceci avant d’imprimer les javadocs, et pourrait même append une partie des javadocs générés indiquant votre utilisation des chaînes de regex.

Avant de voter et de me dire que c’est une idée stupide – JE SAIS, j’ai juste pensé que je le suggérerais parce que c’est intéressant, mais ma préférence, comme je l’ai dit plus haut, est un simple fichier texte …

Non, mais il existe un plug-in IntelliJ qui facilite la gestion de ce problème, appelé manipulation de chaîne .

IntelliJ échappera également automatiquement à une chaîne collée dessus. (Comme @Dread le souligne , Eclipse a un plug-in pour activer cela.)