Pattern (Java Platform SE 7) (Français)

Une représentation compilée dune expression régulière.

Une expression régulière, spécifiée sous forme de chaîne, doit dabord être compilée dans une instance de cette classe. Le modèle résultant peut ensuite être utilisé pour créer un objet Matcher qui peut correspondre à des séquences de caractères arbitraires par rapport à lexpression régulière. Tout létat impliqué dans lexécution dune correspondance réside dans le matcher, de sorte que de nombreux correspondants peuvent partager le même modèle.

Une séquence dappel typique est donc

 Pattern p = Pattern.
("a*b"); Matcher m = p.
("aaaaab"); boolean b = m.
();

Une méthode matches est définie par cette classe par commodité lorsquune expression régulière nest utilisée quune seule fois. Cette méthode compile une expression et compare une séquence dentrée à celle-ci en un seul appel. La déclaration

 boolean b = Pattern.matches("a*b", "aaaaab");

équivaut aux trois déclarations ci-dessus, cependant, pour les correspondances répétées, il est moins efficace car il ne permet pas de réutiliser le modèle compilé.

Les instances de cette classe sont immuables et peuvent être utilisées en toute sécurité par plusieurs threads simultanés. Les instances de la classe Matcher ne sont pas sûres pour une telle utilisation.

Résumé des constructions dexpressions régulières

Antislash, échappements et guillemets

Le caractère backslash (« \ ») sert à introduire des constructions échappées, comme défini dans le tableau ci-dessus, ainsi que pour citer des caractères qui autrement seraient interprétés comme des constructions sans échappement. Ainsi, lexpression \\ correspond à une seule barre oblique inverse et \ {correspond à une accolade gauche.

Cest une erreur dutiliser une barre oblique inverse avant tout caractère alphabétique qui ne désigne pas une construction échappée; ceux-ci sont réservés pour les futures extensions du langage dexpression régulière. Une barre oblique inverse peut être utilisée avant un caractère non alphabétique, que ce caractère fasse partie ou non dune construction sans échappement.

Les barres obliques inverses dans les littéraux de chaîne dans le code source Java sont interprétées comme lexige la spécification du langage Java ™ comme des échappements Unicode (section 3.3) ou dautres échappements de caractères (section 3.10.6) Il est donc nécessaire de doubler les barres obliques inverses dans des littéraux de chaîne qui représentent des expressions régulières pour les protéger de linterprétation par le compilateur de bytecode Java. La chaîne littérale « \ b », par exemple, correspond à un seul caractère de retour arrière lorsquelle est interprétée comme une expression régulière, tandis que « \\ b » correspond à une limite de mot. La chaîne littérale « \ (bonjour \) » est illégale et conduit à une erreur de compilation; pour correspondre à la chaîne (bonjour), la chaîne littérale « \\ (bonjour \\) » doit être utilisée.

Classes de caractères

Les classes de caractères peuvent apparaître dans dautres classes de caractères, et peuvent être composées par lopérateur union (implicite) et lopérateur dintersection (& &). Lopérateur union désigne une classe qui contient tous les caractères appartenant à au moins une de ses classes dopérandes. Lopérateur dintersection désigne une classe qui contient tous les caractères appartenant à ses deux classes dopérandes.

La priorité des opérateurs de classe de caractères est la suivante, du plus élevé au plus bas:

1 Échappement littéral \ x
2 Regroupement
3 Plage az
4 Union
5 Intersection ]

Notez quun ensemble différent de métacaractères est en effet à lintérieur dune classe de caractères quà lextérieur dune classe de caractère. Par exemple, lexpression régulière. perd sa signification particulière à lintérieur dune classe de caractères, tandis que lexpression – devient une plage formant un méta-caractère.

Terminateurs de ligne

Un terminateur de ligne est une séquence dun ou deux caractères qui marque la fin dune ligne de la séquence de caractères dentrée. Les éléments suivants sont reconnus comme des terminateurs de ligne:

Si le mode UNIX_LINES est activé, les seuls terminateurs de ligne reconnus sont les caractères de nouvelle ligne.

Lexpression régulière. correspond à nimporte quel caractère sauf une terminaison de ligne, sauf si lindicateur DOTALL est spécifié.

Par défaut, les expressions régulières ^ et $ ignorent les terminateurs de ligne et ne correspondent respectivement quau début et à la fin de la séquence dentrée entière. Si le mode MULTILINE est activé, alors ^ correspond au début de lentrée et après tout terminateur de ligne sauf à la fin de lentrée. En mode MULTILINE, $ correspond juste avant une fin de ligne ou la fin de la séquence dentrée.

Groupes et capture

Numéro de groupe

Les groupes de capture sont numérotés en comptant leurs parenthèses ouvrantes de gauche à droite.Dans lexpression ((A) (B (C))), par exemple, il existe quatre groupes de ce type:

1

((A) (B (C)))

2

(A)

3

(B (C))

4

(C)

Le groupe zéro représente toujours lexpression entière.

Les groupes de capture sont ainsi nommés car, lors dune correspondance, chaque sous-séquence de la séquence dentrée qui correspond à un tel groupe est enregistrée. La sous-séquence capturée peut être utilisée plus tard dans lexpression, via une référence arrière, et peut également être extraite du matcher une fois lopération de correspondance terminée.

Nom du groupe

Un groupe de capture peut également se voir attribuer un « nom », un groupe de capture nommé, puis être référencé ultérieurement par le « nom ». Les noms de groupe sont composés des caractères suivants. Le premier caractère doit être une lettre.

Un groupe de capture nommé est toujours numéroté comme décrit dans Numéro de groupe.

Lentrée capturée associée à un groupe est toujours la sous-séquence avec laquelle le groupe a le plus récemment mis en correspondance. Si un groupe est évalué une deuxième fois en raison de la quantification, sa valeur précédemment capturée, le cas échéant, sera conservée si la deuxième évaluation échoue. Faire correspondre la chaîne « aba » à lexpression (a (b)?) +, Par exemple, laisse le groupe deux défini sur « b ». Toutes les entrées capturées sont supprimées au début de chaque match.

Les groupes commençant par (? sont soit des groupes purs, sans capture qui ne capturent pas de texte et ne comptent pas dans le total du groupe, soit un groupe de capture nommé.

Prise en charge dUnicode

Cette classe est conforme au niveau 1 de la norme technique Unicode # 18: Expression régulière Unicode, plus les équivalents canoniques RL2.1.

Séquences déchappement Unicode telles que \ u2014 dans le code source Java sont traitées comme décrit dans la section 3.3 de la spécification du langage Java ™. Ces séquences déchappement sont également implémentées directement par lanalyseur dexpressions régulières afin que les échappements Unicode puissent être utilisés dans des expressions lues à partir de fichiers ou à partir du clavier. Ainsi, les chaînes  » \ u2014 « et » \\ u2014 « , même sils ne sont pas égaux, se compilent dans le même modèle, qui correspond au caractère avec la valeur hexadécimale 0x2014.

Un caractère Unicode peut également être représenté dans une expression régulière en utilisant sa notation hexadécimale (valeur du point de code hexadécimal) directement comme décrit dans la construction \ x {…}, pour exemple, un caractère supplémentaire U + 2011F peut être spécifié comme \ x {2011F}, au lieu de deux séquences déchappement Unicode consécutives de la paire de substitution \ uD840 \ uDD1F.

Les scripts, blocs, catégories et propriétés binaires Unicode sont écrits avec les constructions \ p et \ P comme en Perl. \ p {prop} correspond si lentrée a la propriété prop, tandis que \ P {prop} ne correspond pas si lentrée a cette propriété.

Les scripts, blocs, catégories et propriétés binaires peuvent être utilisés à la fois à lintérieur et à lextérieur dune classe de caractères.

Les scripts sont spécifiés soit avec le préfixe Is, comme dans IsHiragana, soit en utilisant le script mot clé (ou sa forme abrégée sc) comme dans script=Hiragana ou sc=Hiragana.

Les noms de script pris en charge par Pattern sont les noms de script valides acceptés et définis par UnicodeScript.forName.

Les blocs sont spécifiés avec le préfixe In, comme dans InMongolian, ou en utilisant le mot-clé block (ou sa forme abrégée blk) comme dans block=Mongolian ou blk=Mongolian.

Les noms de bloc pris en charge par Pattern sont les noms de bloc valides acceptés et définis par UnicodeBlock.forName.

Les catégories peuvent être spécifiées avec le préfixe facultatif Is: à la fois \p{L} et \p{IsL} désigne la catégorie des lettres Unicode. Comme pour les scripts et les blocs, les catégories peuvent également être spécifiées en utilisant le mot-clé general_category (ou sa forme courte gc) comme dans general_category=Lu ou gc=Lu.

Les catégories prises en charge sont celles du standard Unicode dans la version spécifiée par la classe Character. Les noms des catégories sont ceux définis dans la norme, à la fois normatifs et informatifs.

Les propriétés binaires sont spécifiées avec le préfixe Is, comme dans IsAlphabetic.Les propriétés binaires prises en charge par Pattern sont

  • Alphabétique
  • Idéographique
  • Lettre
  • Minuscules
  • Majuscules
  • Titlecase
  • Ponctuation
  • Contrôle
  • White_Space
  • Digit
  • Hex_Digit
  • Noncharacter_Code_Point
  • Assigned

Les classes de caractères prédéfinies et les classes de caractères POSIX sont conformes à la recommandation de Annexe C: Propriétés de compatibilité de lexpression régulière Unicode, lorsque lindicateur UNICODE_CHARACTER_CLASS est spécifié.

Les catégories qui se comportent comme les méthodes booléennes ismethodname java.lang.Character (à lexception des méthodes obsolètes) sont disponibles via la même syntaxe \ p {prop} où la propriété spécifiée porte le nom javamethodname.

Comparaison avec Perl 5

Le moteur Pattern effectue une correspondance traditionnelle basée sur NFA avec une alternance ordonnée comme cela se produit dans Perl 5.

Constructions Perl non supportées par cette classe:

Constructions supportées par cette classe mais pas par Perl:

  • Union et intersection des classes de caractères comme décrit ci-dessus.

Différences notables avec Perl:

  • En Perl, \ 1 à \ 9 sont toujours interprétés comme des références arrière; un nombre échappé par barre oblique inverse supérieur à 9 est traité comme une référence arrière sil existe au moins autant de sous-expressions, sinon il est interprété, si possible, comme un échappement octal. Dans cette classe, les échappements octaux doivent toujours commencer par un zéro. Dans cette classe, \ 1 à \ 9 sont toujours interprétés comme des références arrière, et un plus grand nombre est accepté comme référence arrière si au moins autant de sous-expressions existent à ce point dans lexpression régulière, sinon lanalyseur supprimera les chiffres jusquau nombre est plus petit ou égal au nombre existant de groupes ou il sagit dun chiffre.

  • Perl utilise lindicateur g pour demander une correspondance qui reprend là où la dernière correspondance sest arrêtée. Cette fonctionnalité est fournie implicitement par la classe Matcher: les appels répétés de la méthode find reprendront là où la dernière correspondance sest arrêtée, sauf si le matcher est réinitialisé.

  • En Perl, les indicateurs incorporés au niveau supérieur dune expression affectent lexpression entière. Dans cette classe, les indicateurs intégrés prennent toujours effet à lendroit où ils apparaissent, quils soient au niveau supérieur ou au sein dun groupe; dans ce dernier cas, les drapeaux sont restaurés à la fin du groupe comme en Perl.

Pour une description plus précise du comportement des constructions dexpressions régulières, veuillez consulter Mastering Regular Expressions, 3ème édition, Jeffrey EF Friedl, O « Reilly and Associates, 2006.

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *