Quelle est la meilleure façon de faire correspondre le nom de classe Java complet dans un texte ?
Exemples : java.lang.Reflect
, java.util.ArrayList
, org.hibernate.Hibernate
.
Quelle est la meilleure façon de faire correspondre le nom de classe Java complet dans un texte ?
Exemples : java.lang.Reflect
, java.util.ArrayList
, org.hibernate.Hibernate
.
Voici une classe entièrement ouvrière avec des tests, basée sur l'excellent commentaire de @alan-moore
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
import java.util.regex.Pattern;
import org.junit.Test;
public class ValidateJavaIdentifier {
private static final String ID_PATTERN = "\\p{javaJavaIdentifierStart}\\p{javaJavaIdentifierPart}*";
private static final Pattern FQCN = Pattern.compile(ID_PATTERN + "(\\." + ID_PATTERN + ")*");
public static boolean validateJavaIdentifier(String identifier) {
return FQCN.matcher(identifier).matches();
}
@Test
public void testJavaIdentifier() throws Exception {
assertTrue(validateJavaIdentifier("C"));
assertTrue(validateJavaIdentifier("Cc"));
assertTrue(validateJavaIdentifier("b.C"));
assertTrue(validateJavaIdentifier("b.Cc"));
assertTrue(validateJavaIdentifier("aAa.b.Cc"));
assertTrue(validateJavaIdentifier("a.b.Cc"));
// after the initial character identifiers may use any combination of
// letters and digits, underscores or dollar signs
assertTrue(validateJavaIdentifier("a.b.C_c"));
assertTrue(validateJavaIdentifier("a.b.C$c"));
assertTrue(validateJavaIdentifier("a.b.C9"));
assertFalse("cannot start with a dot", validateJavaIdentifier(".C"));
assertFalse("cannot have two dots following each other",
validateJavaIdentifier("b..C"));
assertFalse("cannot start with a number ",
validateJavaIdentifier("b.9C"));
}
}
Le modèle fourni par Renaud fonctionne, mais sa réponse originale fera toujours marche arrière à la fin.
Pour l'optimiser, vous pouvez essentiellement échanger la première moitié avec la dernière. Notez la correspondance des points que vous devez également modifier.
Ce qui suit est ma version qui, par rapport à l'original, s'exécute environ deux fois plus vite :
String ID_PATTERN = "\\p{javaJavaIdentifierStart}\\p{javaJavaIdentifierPart}*";
Pattern FQCN = Pattern.compile(ID_PATTERN + "(\\." + ID_PATTERN + ")*");
Je ne peux pas écrire de commentaires, j'ai donc décidé d'écrire une réponse à la place.
Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.