Posez votre question Signaler

Java regex problème avec caratère @

vert - Dernière réponse le 10 déc. 2010 à 18:25
Bonjour,
Je souhaiterais remplacer les @ à la fin d'un mot par une autre lettre. Quand je teste @\\\\b cela fonctionne pas (bien que a\\\\b fonctionne bien si je veux remplacer a à la fin d'un mot). Quelqu'un peux m'aider ?
Lire la suite 

Java regex problème avec caratère @ »

10 réponses
Réponse
+1
moins plus
Comment fais-tu ton code ?

Moi je n'ai pas de problème particulier en utilisant un @ avec regex :

import java.util.regex.Pattern; 

static String remplacerFinMots(String phrase, String finAvant,String finApres) 
{ 
       return Pattern.compile(finAvant+"(?=\\W)")
                     .matcher(phrase)
                     .replaceAll(finApres); 
} 
  
public static void main(String args[]) 
{  
       System.out.println(remplacerFinMots("M@ phr@se de test.", "@", "a"));
       // "M@ phr@se de test." -> "Ma phr@se de test." 
}

heyquem- 10 déc. 2010 à 18:25
KX, j'ai mis +1 à ton message pour l'idée de mettre (?=\\W)") comme assertion, ce qui permet de ne remplacer que finAvant dans la chaîne finAvant+"(?=\\W)") puisque ce qui matche \\W n'est pas capturé dans un groupe.

Bien sûr je le savais mais c'était un peu effacé de ma mémoire et j'ai mis deux minutes à ce que ça me revienne.

Je dis aussi ça pour souligner cette pratique. En ignorant à quoi servent certaines aptitudes des regex, on sous-exploite leur immenses possibilités.
Ajouter un commentaire
Réponse
+1
moins plus
'@(?=\W|\Z)'
KX- 10 déc. 2010 à 18:18
En effet, ça marche avec le |

compile("(?=\\b)@(?=\\W|\\Z)")
Ajouter un commentaire
Réponse
+0
moins plus
Salut,

On peut faire tout simplement:

String phrase = "M@ phr@se de test."; 
         phrase = phrase.replaceAll("@", "a"); 
         System.out.println("\nphrase : " + phrase); 


Mais si tu dois (ou si tu veux) utiliser regex:
String phrase = "M@ phr@se de test."; 
      // compilation de la regex avec le motif : "@" 
         Pattern p = Pattern.compile("@"); 
      // création du moteur associé à la regex sur la chaîne "M@ phr@se de test." 
         Matcher m = p.matcher(phrase); 
      // remplacement de toutes les occurrences de "@" par "a" 
         phrase = m.replaceAll("a"); 
         System.out.println("\nphrase : " + phrase); 


Cordialement,

Dan
KX- 9 déc. 2010 à 21:22
Le problème avec tes codes Dan, c'est que "M@ phr@se de test." sera remplacé par "Ma phrase de test." alors que seuls les @ en fin de mots doivent être modifiés pour obtenir "Ma phr@se de test."

Remarque, on peut, comme je l'ai fait, coller toutes les instructions en une seule plutôt que créer des objets intermédiaires lorsque ceux-ci ne sont plus utilisés par la suite...
String ... = Pattern.compile(...).matcher(...).replaceAll(...);
danimo- 10 déc. 2010 à 00:24
Ok KX,

J'ai bien vu que c'est ce que fait ton code et mal interprété ce que demande vert...

Dan
Ajouter un commentaire
Réponse
+0
moins plus
En faite \b@ ne fonctionne pas, c'est @ n'est pas une "lettre" selon regex (Je l'ai appris sur un autre site). KX ton code fonctionne tant que le @ n'est pas à la fin de la chaine de caratère ...
Merci
KX- 10 déc. 2010 à 10:15
Après, il est toujours possible d'affiner l'expression régulière...
Je n'ai pas testé, mais avec la fin de la chaîne de caractère on aurait peut-être :

compile(finAvant+"(?=[\\W$])")
KX- 10 déc. 2010 à 13:22
En fait, avec $, on teste si @ est à la fin d'une ligne (avant un \n).

Pour tester si c'est la fin de la chaîne de caractères, ça devrait être \z ou \Z mais ça me génère une exception, donc je n'ai pas de solution pour ce cas là (sauf rajouter \n à la fin)

Par contre il pourrait être intéressant de rajouter le \b avant @ pour ne pas prendre en compte un @ isolé... Mais après tout dépend ce que tu veux faire, il faut regarder ce qui existe et tester.

compile("(?=\\b)@(?=[\\W$])")
Ajouter un commentaire
Ce document intitulé « Java regex problème avec caratère @ » issu de CommentCaMarche (www.commentcamarche.net) est mis à disposition sous les termes de la licence Creative Commons. Vous pouvez copier, modifier des copies de cette page, dans les conditions fixées par la licence, tant que cette note apparaît clairement.
Dossier à la une
Passage au tout numérique : quel coût pour les particuliers ?