Java regex problème avec caratère @

vert -  
heyquem Messages postés 759 Date d'inscription   Statut Membre Dernière intervention   -
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 ?



A voir également:

4 réponses

KX Messages postés 16761 Date d'inscription   Statut Modérateur Dernière intervention   3 020
 
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." 
}

La confiance n'exclut pas le contrôle
1
heyquem Messages postés 759 Date d'inscription   Statut Membre Dernière intervention   131
 
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.
0
heyquem Messages postés 759 Date d'inscription   Statut Membre Dernière intervention   131
 
'@(?=\W|\Z)'
1
KX Messages postés 16761 Date d'inscription   Statut Modérateur Dernière intervention   3 020
 
En effet, ça marche avec le |

compile("(?=\\b)@(?=\\W|\\Z)")
0
Utilisateur anonyme
 
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
0
KX Messages postés 16761 Date d'inscription   Statut Modérateur Dernière intervention   3 020
 
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(...);
0
Utilisateur anonyme
 
Ok KX,

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

Dan
0
vert
 
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
0
KX Messages postés 16761 Date d'inscription   Statut Modérateur Dernière intervention   3 020
 
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$])")
0
KX Messages postés 16761 Date d'inscription   Statut Modérateur Dernière intervention   3 020
 
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$])")
0