Expression régulière correspondant pleinement qualifié de la classe des noms
Quelle est la meilleure façon de faire correspondre pleinement qualifié du nom de la classe Java dans un texte?
Exemples: java.lang.Reflect
, java.util.ArrayList
, org.hibernate.Hibernate
.
- Ce contexte n'apparaissent-ils dans, java
import
déclarations? Si il n'est que le;
à supprimer, puis ne pas l'utilisation de regex - Oubliez les expressions régulières; voir
javax.lang.model.SourceVersion.isName(CharSequence)
.
Vous devez vous connecter pour publier un commentaire.
Java nom de classe entièrement qualifié (disons "N") est la structure
Le "N" doit être un Java identificateur. Java identificateurs ne peuvent pas commencer par un nombre, mais après le premier caractère qu'ils peuvent utiliser n'importe quelle combinaison de lettres et de chiffres, des traits de soulignement ou des signes dollar:
Ils peuvent également ne pas être un mot réservé (comme
import
,true
ounull
). Si vous voulez vérifier plausibilité seulement, le ci-dessus est assez. Si vous aussi vous voulez vérifier validité, vous devez vérifier à l'encontre d'une liste de mots réservés en tant que bien.Java identificateurs peuvent contenir n'importe Unicode lettre au lieu de "latin seulement". Si vous voulez le vérifier, utilisez classes de caractères Unicode:
ou, pour faire court
La Java Langage de Spécification, (section 3.8) a tous les détails sur identificateur valide noms.
Voir également la réponse à cette question: Java Unicode, les noms de variables
\p{Currency_Symbol}
ou\p{Sc}
doit être utilisé au lieu de$
. Penser à ce sujet, un petit analyseur qui appelleisJavaIdentifierPart()
etisJavaIdentifierStart()
à plusieurs reprises résultat serait plus propre code."(\\p{javaJavaIdentifierStart}\\p{javaJavaIdentifierPart}*\\.)+\\p{javaJavaIdentifierStart}\\p{javaJavaIdentifierPart}*"
. L'élégance, ton nom est de Java!\p{Currency_Symbol}
, mais elle reconnaît\p{Sc}
. N'ai pas testé beaucoup plus loin, mais je vais devoir, parce que RegexBuddy est très important pour mon travail.([\p{L}_\p{Sc}][\p{L}\p{N}_\p{Sc}]*\.)+
$
doit ne pas être utilisé, il ne dit pas que c'est illégal.Ici est un travail entièrement la classe avec des tests, basé sur l'excellent commentaire de @alan-moore
VALID_JAVA_IDENTIFIER
est un mauvais choix pour le nom, en tant que motif représente un FQCN. Je suggère de l'extraction deString ID_PATTERN = "\\p{javaJavaIdentifierStart}\\p{javaJavaIdentifierPart}*"
pour le rendre plus évidente et lisible.VALID_JAVA_IDENTIFIER
représente un FQCN? De Plus, pas sûrID_PATTERN
est plus lisible... Merci pour l'explication.ID_PATTERN
voir mon montage sur Jörgen de réponse; il est plus facile de voir ce qui est répété et quand, vous pouvez aussi ne pas avoir à faire défiler ou des lignes de rupture.Le modèle fourni par Renaud travaille. Mais, autant que je peux dire, il va toujours revenir en arrière à la fin.
Pour l'optimiser, vous pouvez échanger le premier semestre avec la dernière. Notez le point du match que vous avez aussi besoin de changer.
Voici ma version de ce que, par rapport à l'original, fonctionne environ deux fois plus rapide:
Je ne peux pas écrire des commentaires, j'ai donc décidé d'écrire une réponse à la place.
Je suis venu (sur mes) pour une semblable réponse (comme Tomalak de réponse), quelque chose comme M. M. M. N:
Où,
Toutefois, cette expression régulière (à la différence de Tomalak réponse) fait plusieurs hypothèses:
Le nom du package (Le M) sera uniquement en minuscules, le premier caractère de M sera toujours moindre lettre, le reste peut mélanger trait de soulignement, de la baisse de lettres et de chiffres.
Le Nom de la Classe (à la N de la partie) commence toujours par une Lettre majuscule ou un trait de soulignement, le reste peut mélanger trait de soulignement, des lettres et des chiffres. Les Classes internes commencera toujours par un symbole dollar ($) et doit obéir le nom de la classe les règles décrites précédemment.
Remarque: le motif \w est le schéma XSD pour les lettres et les chiffres (il ne comprend pas le symbole de soulignement (_))
Espérons que cette aide.
Expression suivante fonctionne parfaitement bien pour moi.
La classe suivante valide qu'un nom de package est valable:
version plus courte d'un travail regexp:
Je vais dire quelque chose comme
([\w]+\.)*[\w]+
Mais peut-être que je peux être plus précis pour savoir ce que vous voulez faire avec elle 😉
[]
, cela devrait être assez(\\w+\\.?)+