web-dev-qa-db-fra.com

String.replaceAll () ne fonctionne pas

Je modifie un e-mail provenant de tesseract ocr.

Voici mon code:

 if (email != null) {
        email = email.replaceAll(" ", "");
        email = email.replaceAll("caneer", "career");
        email = email.replaceAll("canaer", "career");
        email = email.replaceAll("canear", "career");
        email = email.replaceAll("caraer", "career");
        email = email.replaceAll("carear", "career");
        email = email.replace("|", "l");
        email = email.replaceAll("}", "j");
        email = email.replaceAll("j3b", "job");
        email = email.replaceAll("gmaii.com", "gmail.com");
        email = email.replaceAll("hotmaii.com", "hotmail.com");
        email = email.replaceAll(".c0m", ".com");
        email = email.replaceAll(".coin", ".com");
        email = email.replaceAll("consuit", "consult");
    }
    return email;

Mais la sortie n'est pas correcte.

Entrée:

amrut=ac.hrworks@g mai|.com

Sortie:

lalcl.lhlrlwlolrlklsl@lglmlalil|l.lclolml

Mais lorsque j'ai affecté le résultat à une nouvelle chaîne après chaque remplacement, cela fonctionne très bien. Pourquoi l'affectation continue dans la même chaîne ne fonctionne pas?

18
Neeraj

Vous noterez dans le Javadoc pour String.replaceAll () que le premier argument est un expression régulière .

Une période (.) y a une signification particulière, tout comme un tuyau (|) tout comme une accolade (}). Vous devez tous les échapper, tels que:

email = email.replaceAll("gmaii\\.com", "gmail.com");
38
Brian Roach

(Est-ce Java?)

Notez qu'en Java, replaceAll accepte une expression régulière et le point correspond à n'importe quel caractère. Vous devez échapper au point ou utiliser

somestring.replaceAll(Pattern.quote("gmail.com"), "replacement");

Notez également la faute de frappe ici:

email = emai.replaceAll("canear", "career");

devrait être

email = email.replaceAll("canear", "career");
10
David M. R.

En réalisant que replaceAll() le premier argument est regex vous pouvez faire vos comparaisons beaucoup moins

Par exemple, vous pouvez vérifier les éventuelles fautes d'orthographe du mot career par le biais de regex

email = email.replaceAll("ca[n|r][e|a][e|a]r", "career"));

6
iTech

Vous devez vous échapper . par \\.comme suit:

if (email != null) {
    email = email.replaceAll(" ", "");
    email = email.replaceAll("caneer", "career");
    email = email.replaceAll("canaer", "career");
    email = email.replaceAll("canear", "career");
    email = email.replaceAll("caraer", "career");
    email = email.replaceAll("carear", "career");
    email = email.replace("|", "l");
    email = email.replaceAll("}", "j");
    email = email.replaceAll("j3b", "job");
    email = email.replaceAll("gmaii\\.com", "gmail.com");
    email = email.replaceAll("hotmaii\\.com", "hotmail.com");
    email = email.replaceAll("\\.c0m", "com");
    email = email.replaceAll("\\.coin", "com");
    email = email.replaceAll("consuit", "consult");
}
return email;
6
Sumit Singh

Vous utilisez des caractères regex.

Veuillez les échapper en utilisant \ ou en utilisant Pattern.quote méthode

5
Thihara

Je pense que vous ne savez pas que le premier paramètre de replaceAll est regex.

., |, } pourrait être interprété différemment de vos attentes.

.   Any character (may or may not match line terminators)

http://docs.Oracle.com/javase/6/docs/api/Java/util/regex/Pattern.html

Pour l'espace que vous utilisez mieux

\s  A whitespace character: [ \t\n\x0B\f\r]

et échappez à d'autres caractères spéciaux avec un \\

5
Nikolay Kuznetsov