41 votes

Expression régulière correspondant aux noms de classe complets

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 .

8voto

Renaud Points 3226

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"));
    }
}

7voto

Jörgen Lundgren Points 116

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.

0voto

gopalanrc Points 93

L'expression suivante fonctionne parfaitement pour moi.

 ^[a-z][a-z0-9_]*(\.[a-z0-9_]+)+$

Prograide.com

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.

Powered by:

X