Строка.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]
и избежать других специальных символов с ведущим \