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
Но когда я назначил результат новой строчке после каждой замены, она отлично работает. Почему непрерывное присвоение в той же строке не работает?
Ответы
Ответ 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