Java regex problème avec caratère @

Fermé
vert - Modifié par vert le 9/12/2010 à 09:34
heyquem Messages postés 759 Date d'inscription mercredi 17 juin 2009 Statut Membre Dernière intervention 29 décembre 2013 - 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 ?



A voir également:

4 réponses

KX Messages postés 16754 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 25 novembre 2024 3 020
Modifié par KX le 9/12/2010 à 12:30
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 mercredi 17 juin 2009 Statut Membre Dernière intervention 29 décembre 2013 131
Modifié par heyquem le 10/12/2010 à 18:33
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 mercredi 17 juin 2009 Statut Membre Dernière intervention 29 décembre 2013 131
10 déc. 2010 à 18:08
'@(?=\W|\Z)'
1
KX Messages postés 16754 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 25 novembre 2024 3 020
10 déc. 2010 à 18:18
En effet, ça marche avec le |

compile("(?=\\b)@(?=\\W|\\Z)")
0
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 16754 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 25 novembre 2024 3 020
Modifié par KX le 9/12/2010 à 21:26
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
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
0
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 16754 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 25 novembre 2024 3 020
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$])")
0
KX Messages postés 16754 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 25 novembre 2024 3 020
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$])")
0