2009-06-19 8 views
2

En PHP j'utiliser ceci:Méthode pour substituer l'étranger pour les caractères anglais en Java?

$text = "Je prends une thé chaud, s'il vous plaît"; 
$search = array('é','î','è'); // etc. 
$replace = array('e','i','e'); // etc. 
$text = str_replace($search, $replace, $text); 

Mais la méthode Java String « remplacer » ne semble pas accepter que des tableaux en entrée. Y a-t-il un moyen de le faire (sans avoir à recourir à une boucle for pour passer par le tableau)?

Veuillez dire s'il y a une manière plus élégante que la méthode que j'essaye.

Répondre

1

Vous allez devoir faire une boucle:

String text = "Je prends une thé chaud, s'il vous plaît"; 
Map<Character, String> replace = new HashMap<Character, String>(); 
replace.put('é', "e"); 
replace.put('î', "i"); 
replace.put('è', "e"); 
StringBuilder s = new StringBuilder(); 
for (int i=0; i<text.length(); i++) { 
    char c = text.charAt(i); 
    String rep = replace.get(c); 
    if (rep == null) { 
    s.append(c); 
    } else { 
    s.append(rep); 
    } 
} 
text = s.toString(); 

Note: Certains caractères sont remplacés par plusieurs caractères. En allemand, par exemple, u-tréma est converti en "ue".

Édition: Fait beaucoup plus efficace.

+0

Sauf en Java. (Désolé, n'a pas pu résister.) –

+0

Ugh. Veuillez ne pas utiliser la méthode basée sur l'expression rationnelle pour cela. –

+0

Au deuxième coup d'œil, je suppose que vous devez si vous voulez remplacer les caractères simples par plusieurs, mais je ne suis pas sûr que l'OP le souhaite. Il devrait être implémenté localement et se terminer probablement par un désordre ad-hoc - je ne pense pas que toutes les langues aient des règles bien établies pour substituer des caractères accentués comme l'a fait l'allemand. –

0

Vous aurez besoin d'une boucle.

Une solution efficace serait quelque chose comme ce qui suit:

Map<Character, Character> map = new HashMap<Character, Character>(); 
    map.put('é', 'e'); 
    map.put('î', 'i'); 
    map.put('è', 'e'); 

    StringBuilder b = new StringBuilder(); 
    for (char c : text.toCharArray()) 
    { 
     if (map.containsKey(c)) 
     { 
      b.append(map.get(c)); 
     } 
     else 
     { 
      b.append(c); 
     } 
    } 
    String result = b.toString(); 

Bien sûr, dans un véritable programme vous la construction comportant à la fois de la carte et le remplacement dans leurs méthodes respectives.

2

Aucune méthode ne fonctionne de manière identique à celle de PHP dans l'API standard, bien qu'il y ait peut-être quelque chose dans Apache Commons. Vous pouvez le faire en remplaçant les caractères individuellement:

s = s.replace('é','e').replace('î', 'i').replace('è', 'e'); 

Une méthode plus sophistiquée qui ne vous oblige pas à énumérer les caractères à remplacer (et est donc plus susceptible de ne pas manquer quoi que ce soit), mais ne nécessite une boucle (qui se produira de toute façon en interne, quelle que soit la méthode que vous utiliserez) serait d'utiliser java.text.Normalizer pour séparer les lettres et les signes diacritiques, puis enlever tout avec un type de caractère de Character.MODIFIER_LETTER.

3

Une très bonne façon de le faire est d'utiliser la classe replaceEach() method from the StringUtils dans Apache Commons Lang 2.4.

String text = "Je prends une thé chaud, s'il vous plaît"; 
String[] search = new String[] {"é", "î", "è"}; 
String[] replace = new String[] {"e", "i", "e"}; 
String newText = StringUtils.replaceEach(text, 
       search, 
       replace); 

Résultats dans

Je prends une the chaud, s'il vous plait 
+2

Il est rarement utile d'ajouter une dépendance de bibliothèque pour une fonction triviale à implémenter. – cletus

+3

Trivial à mettre en œuvre, pas si trivial pour tester peut-être. En utilisant une bibliothèque aussi largement utilisée que commons-lang, vous pouvez être raisonnablement confiant que cela fonctionne bien. –

+2

On pourrait aussi bien dire qu'il vaut rarement la peine de ré-implémenter un utilitaire (en ajoutant plus de code propre à tester et à maintenir) lorsqu'une implémentation parfaite existe déjà dans une bibliothèque largement utilisée. – Jonik

2

Je ne suis pas un gars de Java, mais je vous recommande une solution générique en utilisant la Normalizer class pour décomposer les caractères accentués et puis retirez les Unicode caractères « COMBINAISON ».

+0

Michael Borgwardt a mentionné l'élimination des caractères Character.MODIFIER_LETTER. Lequel est-ce, ou avez-vous essentiellement voulu dire la même chose? – Jonik

+0

+1 Intéressant! – starblue

+1

Formellement, catégorie Unicode Lm, à laquelle correspond Character.MODIFIER_LETTER. C'est clairement ce qui est nécessaire ici: http://www.dpawson.co.uk/xsl/rev2/UnicodeCategories.html. La catégorie Mc "Mark, spacing combination" ne semble s'appliquer qu'à certaines langues asiatiques. –

Questions connexes