web-dev-qa-db-fra.com

Java méta caractère RegEx (.) Et point ordinaire?

Dans Java RegEx, comment connaître la différence entre . (point), le méta-caractère et le point normal, comme dans toute phrase. Comment gérer ce genre de situation avec d'autres méta-caractères, comme (*, +, /d, ...)

137
JavaUser

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. Étant donné que les expressions rationnelles dans Java sont des chaînes Java normales, vous devez échapper à la barre oblique inverse elle-même. Vous devez donc utiliser deux barres obliques inverses, par exemple. \\.

255
Fabian Steeg

Les solutions proposées par les autres membres ne fonctionnent pas pour moi.

Mais j'ai trouvé ceci:

échapper à un point dans Java regexp écrire [.]

18
Kael

Les expressions rationnelles de style Perl (sur lesquelles le moteur de regex Java est plus ou moins basé) traitent les caractères suivants en tant que caractères spéciaux:

.^$|*+?()[{\ a une signification particulière en dehors de des classes de caractères,

]^-\ a une signification particulière à l'intérieur des classes de caractères ([...]).

Vous devez donc éviter ces symboles (et uniquement ces symboles) en fonction du contexte (ou, dans le cas des classes de caractères, les placer dans des positions où ils ne peuvent pas être mal interprétés).

Éviter inutilement d'autres caractères peut fonctionner, mais certains moteurs d'expression régulière traitent cela comme des erreurs de syntaxe. Par exemple, \_ provoquera une erreur dans .NET.

D'autres conduiront à de faux résultats, par exemple, \< est interprété comme un littéral < en Perl, mais en egrep, cela signifie "limite de mot".

Donc, écrivez -?\d+\.\d+\$ pour correspondre à 1.50$, -2.00$ etc. et [(){}[\]] pour une classe de caractères qui correspond à tous les types de crochets/accolades/parenthèses.

Si vous devez transformer une chaîne de saisie utilisateur en un formulaire protégé par les expressions rationnelles, utilisez Java.util.regex.Pattern.quote.

Pour en savoir plus: RegexGuru, le blog de Jan Goyvaert, sur le fait d'échapper aux métacaractères

16
Tim Pietzcker

Échapper aux caractères spéciaux avec une barre oblique inverse. \., \*, \+, \\d, etc. En cas de doute, 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.

Voici le code que vous pouvez directement copier coller:

String imageName = "picture1.jpg";
String [] imageNameArray = imageName.split("\\.");
for(int i =0; i< imageNameArray.length ; i++)
{
   system.out.println(imageNameArray[i]);
}

Et si par erreur il restait des espaces avant ou après "." Dans de tels cas? Il est toujours préférable de considérer ces espaces également.

String imageName = "picture1  . jpg";
String [] imageNameArray = imageName.split("\\s*.\\s*");
    for(int i =0; i< imageNameArray.length ; i++)
    {
       system.out.println(imageNameArray[i]);
    }

Ici, \\ s * est là pour considérer les espaces et vous donner uniquement les chaînes séparées.

1

Je voulais faire correspondre une chaîne qui se termine par ". *" Pour cela, je devais utiliser ce qui suit:

"^.*\\.\\*$"

Un peu bête si vous y réfléchissez: D Heres ce que cela signifie. Au début de la chaîne, il peut y avoir n'importe quel caractère zéro ou plusieurs fois suivi d'un point "." suivi d'une étoile (*) à la fin de la chaîne.

J'espère que cela sera utile pour quelqu'un. Merci pour le backslash à Fabian.

1
Atspulgs

Je suis en train de faire un tableau de base dans JGrasp et je l'ai trouvé avec une méthode d'accès pour un tableau char [] [] à utiliser ('.') Pour placer un seul point.

0
rgm

Si vous voulez terminer, vérifiez si votre phrase se termine par "." alors vous devez ajouter [\. \] $ à la fin de votre modèle.

0
Madhu Gogineni