String.replaceAll() не работает - программирование
Подтвердить что ты не робот

String.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;

Но вывод неправильный.

Вход:

[email protected] mai|.com

Выход:

[email protected]|l.lclolml

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

4b9b3361

Ответ 1

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

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

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

Ответ 2

(Является ли эта Java?)

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

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

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

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

должен быть

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

Ответ 3

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

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

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

Ответ 4

Вам нужно выйти . на \\., как показано ниже:

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;

Ответ 5

Я думаю, вы не знаете, что первый параметр 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]

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

Ответ 6

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

Удалите их с помощью \ или с помощью метода Pattern.quote