Meta caractère Java RegEx (.) Et point ordinaire?


150

Dans Java RegEx, comment trouver la différence entre .(point) le méta-caractère et le point normal comme nous l'utilisons dans n'importe quelle phrase. Comment gérer ce genre de situation pour d' autres caractères meta aussi comme ( *, +, \d, ...)

Réponses:


276

Si vous voulez que le point ou d'autres caractères avec une signification spéciale dans les expressions régulières soient un caractère normal, vous devez l'échapper avec une barre oblique inverse. Puisque les expressions rationnelles en Java sont des chaînes Java normales, vous devez échapper la barre oblique inverse elle-même, vous avez donc besoin de deux barres obliques inverses, par exemple\\.


1
ce correctif s'applique également à bash
krivar

18
Sachez que l'échappement de la barre oblique inverse dépend de la façon dont vous fournissez l'expression régulière. s'il est codé en dur, vous devez utiliser: "\\." , si vous lisez à partir d'une source brute (par exemple un fichier texte), vous n'utilisez qu'une seule barre oblique inverse: \.
Paul

25

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

Mais j'ai trouvé ceci:

pour échapper à un point dans java regexp write [.]


2
Même chose, cela \\.n'a pas fonctionné pour moi: se \.plaindre qu'il .n'est pas nécessaire d'échapper, lui \\.faire penser que c'était à la \.place ., \\\.et le constructeur a lancé une erreur, [.]c'était la seule chose qui fonctionnait.
mithunc

1
@mithunc C'est étrange, à l' \\.intérieur d'un littéral de chaîne vous donne ce \.dont le regex a besoin pour voir le point comme un point littéral au lieu du matcher n'importe quel caractère.
klaar le

16

Les expressions régulières de style Perl (sur lesquelles le moteur Java regex est plus ou moins basé) traitent 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 particulière à l' intérieur des classes de caractères ( [...]).

Vous devez donc échapper à ces symboles (et uniquement ceux-ci) 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).

L'échappement inutile d'autres caractères peut fonctionner, mais certains moteurs d'expression régulière traiteront cela comme des erreurs de syntaxe, par exemple \_provoquera une erreur dans .NET.

Certains autres conduiront à de faux résultats, par exemple \<est interprété comme un littéral <en Perl, mais en egrepcela signifie «limite de mot».

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

Si vous avez besoin de transformer une chaîne d'entrée utilisateur en une forme regex-safe, utilisez java.util.regex.Pattern.quote.

Lectures complémentaires: le blog RegexGuru de Jan Goyvaert sur les métacaractères qui s'échappent


4

Échappez 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.


Échapper à des caractères non spéciaux peut inutilement fonctionner dans certaines langues mais peut échouer dans d'autres, il est donc préférable de ne pas prendre l'habitude.
Tim Pietzcker

1
Cette question concerne spécifiquement Java, et docs.oracle.com/javase/6/docs/api/java/util/regex/… dit: «Une barre oblique inverse peut être utilisée avant un caractère non alphabétique, que ce caractère soit partie d'une construction sans échappée. "
Christoffer Hammarström

2

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 reste des espaces avant ou après "." dans ces 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 fractionnées requises.


1

Je voulais faire correspondre une chaîne qui se termine par ". *" Pour cela, j'ai dû utiliser ce qui suit:

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

Un peu idiot si vous y réfléchissez: D Voici 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 la barre oblique inverse à Fabian.


Utilisez simplement "\\.\\*$"alors. Pas besoin de faire correspondre le début de la chaîne si cela ne vous importe pas.
Ophidian le

Oui vous avez raison. Pour être honnête, je ne me souviens pas du cas d'utilisation pour ceci: /
Atspulgs

Ce n'était pas vraiment pour vous aider mais pour aider les autres à regarder votre message: P
Ophidian

0

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


0

Je fais un tableau de base dans JGrasp et j'ai trouvé cela avec une méthode d'accesseur pour un tableau char [] [] à utiliser ('.') Pour placer un seul point.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.