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, ...)

JavaUser
la source

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\\.

Fabian Steeg
la source
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 [.]

Kael
la source
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

Tim Pietzcker
la source
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.

Christoffer Hammarström
la source
É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.

Vyankatesh S Repal
la source
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.

Atspulgs
la source
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.

Madhu Gogineni
la source
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.

rgm
la source