Это решение полностью работает!
String str="j.r. 20 lb jockey - j.d. pinkus j. d. choni j.d.d.";
removeInitialsDots(str);
Функция:
private String removeInitialsDots(String str) {
str=str.replaceAll("(?i)(^([a-z])\\.|(?<= )([a-z])\\.|(?<=\\.)([a-z])\\.)", "$2$3$4").trim();
str=str.replaceAll("(?i)^(([a-z]) ([a-z]))($| )", "$2$3"+SPACE).trim();
str=str.replaceAll("(?i)(?<= )(([a-z]) ([a-z]))($| )", "$2$3"+SPACE).trim();
return str;
}
Объяснение:
(? I) -> игнорировать регистр
(^ ([az]) \. | (? <=) ([az]) \. | (? <= \.) ([az]) \.) -> (инициал в начале строки |, перед которым стоит пробел| предшествует точка)
^ (([az]) ([az])) ($ |) -> в начале строки: один символ, пробел, один символ (конец строки или пробел)
(? <=) (([Az]) ([az])) ($ |) -> с пробелом: один символ, пробел, один символ (конец строки или пробел)
$ 1 $ 2 ... -> - группы замещения, которые мы хотим, чтобы группы определялись в скобках по порядку (исключая lookbehinds (? <=)) </p>