Вы можете использовать это регулярное выражение, чтобы захватить первую букву имени в группе 1 и первую букву фамилии в группе 2 и заменить полное совпадение на $1$2
, чтобы получить желаемую строку.
^\s*([a-zA-Z]).*\s+([a-zA-Z])\S+$
Пояснение:
^
- начало строки
\s*
- Соответствует необязательным пробелам
([a-zA-Z])
- соответствует первой букве имени и захватывает ее в группе 1
.*\s+
- Здесь .*
соответствует любому тексту с жадностью, а \s+
гарантирует, что он соответствует последнему пробелу непосредственно перед фамилией
([a-zA-Z])
- захватывает первую букву фамилии и захватывает ее в группе2
\S+$
- Соответствует оставшейся части фамилии и концу ввода
Regex Demo
Java-код,
String s = "A A BCD EFG";
System.out.println(s.replaceAll("^\\s*([a-zA-Z]).*\\s+([a-zA-Z])\\S+$", "$1$2"));
Печать
AE
Редактировать: Чтобы преобразовать / обеспечить замену текста в верхний регистр, если имя написано строчными буквами, в регулярном выражении на основе PCRE вы можете использовать \U
непосредственно перед заменой как \U$1$2
но поскольку этот пост написан на Java, он не будет работать таким образом, и поэтому вы можете использовать .toUpperCase()
Демонстрация того, что заменяемый текст должен быть в верхнем регистре
Java-код для того же будет использовать .toUpperCase()
String s = "a A BCD eFG";
System.out.println(s.replaceAll("^\\s*([a-zA-Z]).*\\s+([a-zA-Z])\\S+$", "$1$2").toUpperCase());
Печать в верхнем регистре, несмотря на то, что входная строка в нижнем регистре,
AE