Строка.replaceAll() не работает

я редактирую письмо, полученное от Tesseract ocr.

вот мой код:

 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;

но вывод неверен.

вход :

amrut=ac.hrworks@g mai|.com

выход :

lalcl.lhlrlwlolrlklsl@lglmlalil|l.lclolml

но когда я назначил результат новой строке после каждой замены, он работает нормально. Почему непрерывное назначение в одной строке не работает?

6 ответов


вы заметите в Javadoc для строки.replaceAll () что первым аргументом является регулярные выражения.

срок (.) имеет там особое значение, как и труба (|) и фигурные скобки (}). Вам нужно избежать их всех, таких как:

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

(это Java?)

обратите внимание, что в Java replaceAll принимает регулярное выражение, и точка соответствует любому символу. Вам нужно избежать точки или использовать

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

Также обратите внимание на опечатку здесь:

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

должно быть

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

осознавая, что replaceAll() первый аргумент regex вы можете сделать ваши сравнения гораздо меньше

например, вы можете проверить возможные опечатки в слове career следующим regex

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


вы должны бежать . by \.следующее :

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;

вы используете некоторые символы регулярного выражения.

пожалуйста, избежать их с помощью \ и с помощью Pattern.quote метод


Я думаю, вы не знаете, что первый параметр replaceAll регулярным выражением.

. , |, } может быть истолковано иначе, чем вы ожидали.

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

http://docs.oracle.com/javase/6/docs/api/java/util/regex/Pattern.html

для пространства лучше использовать

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

и избежать других специальных символов с ведущим \