Как получить первый и последний инициал / символ из строки имени - PullRequest
2 голосов
/ 19 апреля 2019

Я пытаюсь извлечь первый символ имени и фамилии из строки, но пока не получилось (попытался найти несколько решений в сети, тоже не повезло). Например, если это строка:

name = A A BCD EFG

Я хочу отобразить только A и E (скажем, AE).Я пытаюсь выяснить, есть ли более простой способ сделать это.Регулярное выражение, которое я использую, действительно дает мне первый символ, но не работает для последнего символа, оно возвращает (AEFG), то есть вместо полной фамилии.Есть ли способ пойти по этому поводу?Вот мой код:

 String lastName = "";
        String firstName= "";

        if(name.split("\\w+").length>1){

            lastName = name.substring(name.lastIndexOf(" ")+1,1);
            firstName = name.substring(0,1);
        }
        else{
            firstName = name;
        }
        String completeInitials = firstName + " " + lastName;

Ответы [ 2 ]

6 голосов
/ 19 апреля 2019

Вы можете использовать это регулярное выражение, чтобы захватить первую букву имени в группе 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
1 голос
/ 19 апреля 2019

Что насчёт этого: разбить имя String на части.Затем возьмите первый char из первой и последней части.

Это решение печатает оба инициала (имя и фамилия), если оба присутствуют, и только один инициал (имя), если только имяили дается фамилия.

private void printInitials(String name) {
    String[] nameParts = name.split(" ");
    String firstName = nameParts[0];
    char firstNameChar = firstName.charAt(0);
    if (nameParts.length > 1) {
        System.out.println("First character of first name: " + firstNameChar);
        String lastName = nameParts[nameParts.length - 1];
        char lastNameChar = lastName.charAt(0);
        System.out.println("First character of last name: " + lastNameChar);
    }
    else {
        System.out.println("First character name: " + firstNameChar);
    }
}

Так, в случае A A BCD EFG, она печатает:

First character of first name: A
First character of last name: E

А в случае 'AABCDEFG`, она печатает:

First character name: A
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...