2010-09-09 6 views

Répondre

209

Si vous souhaitez que le point ou d'autres caractères ayant une signification particulière dans les expressions régulières soient des caractères normaux, vous devez y échapper avec un antislash. Étant donné que les expressions régulières 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 ex. \\.

+1

ce correctif s'applique également à bash – krivar

+11

Sachez que l'échappement de la barre oblique inverse dépend de la façon dont vous fournissez l'expression rationnelle. Si vous avez codé en dur, vous devez utiliser: "\\". Si vous lisez une source brute (par exemple un fichier texte), vous n'utilisez qu'une seule barre oblique inverse: \. – Paul

4

Échapper les caractères spéciaux avec un antislash. \., \*, \+, \\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 the javadoc for java.util.regex.Pattern pour plus d'informations.

+0

Echapper à des caractères 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. –

+1

Cette question concerne spécifiquement Java, et http://docs.oracle.com/javase/6/docs/api/java/util/regex/Pattern.html#bs dit "Une barre oblique inversée peut être utilisée avant une caractère alphabétique, que ce caractère fasse ou non partie d'une construction non échappée. " –

14

Perl style des expressions régulières (que le moteur Java regex est plus ou moins basée sur) traiter les caractères suivants comme des caractères spéciaux:

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

]^-\ ont une signification spéciale à l'intérieur des classes de caractères ([...]). Vous avez donc besoin d'échapper à ces symboles (et seulement ceux-ci) en fonction du contexte (ou, dans le cas de classes de caractères, placez-les dans des positions où ils ne peuvent pas être mal interprétés).

Échapper inutilement à d'autres caractères peut fonctionner, mais certains moteurs d'expressions régulières traiteront cela comme des erreurs de syntaxe, par exemple \_ provoquera une erreur dans .NET. Certains autres conduiront à des résultats erronés, par exemple \< est interprété comme un littéral < en Perl, mais en egrep cela signifie "limite de mot".

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

Si vous devez transformer une chaîne d'entrée utilisateur en une forme sans danger pour la regex, utilisez java.util.regex.Pattern.quote.

Pour en savoir plus: Jan Goyvaert's blog RegexGuru on escaping metacharacters

1

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

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

Kinda stupide si vous pensez à ce sujet: D Voici ce que cela signifie. Au début de la chaîne, il peut y avoir un 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 d'autre. Merci pour le backslash à Fabian.

12

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

Mais je trouve ceci:

pour échapper à un point en java regexp écrire [.]

+0

De même, '\\.' N'a pas fonctionné pour moi: '\ .' s'est plaint que' .' n'a pas besoin d'être échappé, '\\.' A fait croire que c'était '\ .' au lieu de '.', ' \\\. 'Et le constructeur a jeté une erreur, ' [.] 'Était la seule chose qui a fonctionné. – mithunc

1

Code est ici 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 erreur il y a des espaces gauche avant ou après "." dans ces cas? C'est toujours la meilleure pratique de considérer ces espaces aussi.

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 tenir compte des espaces et vous donner uniquement des chaînes nécessaires dédoublées.

Questions connexes