En Java RegEx, comment connaître la différence entre .
(point) du méta-caractère et le point normal, comme dans toute phrase. Comment gérer ce genre de situation pour d'autres méta-personnages aussi, comme ( *
, +
, /d
, ...)
Réponses
Trop de publicités? Si vous voulez que le point ou d'autres caractères ayant une signification spéciale dans les expressions rationnelles soient des caractères normaux, vous devez y échapper avec une barre oblique inverse. Comme les expressions rationnelles en Java sont des chaînes Java normales, vous devez échapper à la barre oblique inverse, vous avez donc besoin de deux barres obliques inverses, par exemple \\.
Perl-style expressions régulières (dont le moteur d'expressions régulières Java est plus ou moins basé sur) traiter les caractères suivants comme des caractères spéciaux:
.^$|*+?()[{\
ont une signification particulière en dehors des classes de caractères,
]^-\
ont une signification spéciale à l'intérieur de classes de caractères ([...]
).
Si vous avez besoin d'échapper à ceux (et uniquement ceux-ci) des symboles selon le contexte (ou, dans le cas de classes de personnages, de les placer dans des positions où ils ne peuvent pas être mal interprété).
Inutilement pour échapper à d'autres caractères peuvent travailler, mais certains regex moteurs de traiter ce que les erreurs de syntaxe, par exemple \_
entraîne une erreur .NET.
D'autres vont conduire à des résultats faux, par exemple \<
est interprété comme un littéral <
en Perl, mais, en egrep
il signifie "mot".
Afin d'écrire en -?\d+\.\d+\$
pour correspondre 1.50$
, -2.00$
etc. et [(){}[\]]
pour une classe de caractères qui correspond à tous les types de supports/bretelles/parenthèses.
Si vous avez besoin de transformer un utilisateur de la chaîne d'entrée dans une regex-forme sûre, utilisez java.util.regex.Pattern.quote
.
Pour en savoir plus: Jan Goyvaert blog RegexGuru sur la fuite des métacaractères
Échapper aux caractères spéciaux avec une barre oblique inverse. \.
, \*
, \+
, \\d
, et ainsi de suite. Si vous n'êtes pas sûr, vous pouvez échapper à tout caractère non alphabétique, qu'il soit spécial ou non. Voir le javadoc pour java.util.regex.Pattern pour plus d'informations.