Помогите доработать регулярное выражение с группами

Вводится строка следующего вида:

Фамилия,Имя,Отчество,Год,Событие

Необходимо написать метод String convert(String s), который преобразует входную строку в следующий вид:

И.О. Фамилия совершил Событие в Год году

Менять падеж не нужно. На данный момент есть такой код:

public static void main(String[] args) {
        Scanner src = new Scanner(System.in);
        String s = src.nextLine(); 
        System.out.println(convert(s));
}

static String convert(String s) {
    String pattern = "(\\S+\\s)(\\S{1})\\S+\\s(\\S{1})\\S+";
    String str = s.replaceAll(pattern, "$1$2.$3.");
    return str;
}

Программа вводит ФИО (без запятых) и выводит Фамилия И.О.: введите сюда описание изображения

Пример: Гагарин,Юрий,Алексеевич,1961,полёт в космос == Ю.А. Гагарин совершил полёт в космос в 1961 году

Пока программа вывод следующее:
введите сюда описание изображения

К тому же программа не работает на других языках, можно ли как-то расширить регулярное выражение через звездочку, чтобы работала на любых символах любого алфавита?


Ответы (1 шт):

Автор решения: Zhenyria

Решение с регулярным выражением

По-моему у вас неправильная регулярка. Она вообще ничего не парсит. Посмотрите, вот здесь всё работает:

public static void main(String[] args) {
    System.out.println(convert("Петров,Иван,Иванович,1961,полёт в космос"));
    System.out.println(convert("Васильев,Гоша,Степанович,1988,ограбил ларёк"));
    System.out.println(convert("Ivanov,Ivan,Ivanovich,1952,to born"));
}

static String convert(String s) {
    Pattern pattern = Pattern.compile("(\\S+?),(\\S)\\S+?,(\\S)\\S+?,(\\d+),(.*)");
    Matcher matcher = pattern.matcher(s);
    matcher.find();

    return matcher.group(3) +
           "." +
           matcher.group(2) +
           ". " +
           matcher.group(1) +
           " совершил событие " +
           matcher.group(5) +
           " в " +
           matcher.group(4) +
           " году";
}

На самом деле всё просто. Первая группа: (\\S+?) это фамилия, причём берём её целиком. После запятой идёт группа из одной первой буквы: (\\S)\\S+?, а после группы, насколько видите, идут символы, чтобы заполнить слово.

Вы можете подробней ознакомиться с моим регулярным выражением по ссылке. И посмотрите внимательней на свою регулярку по ссылке. Она очень странно работает.

Решение при помощи split()

Решение с регулярными выражениями очень сильно переусложнено. У вас очень простые вводные: строка, разделённая запятыми (даже без пробелов!). У String есть прекрасный метод split(), который разбивает строку на массив строк. Подайте в него регулярное выражение, которое будет распознавать разделитель: на выходе у вас будет массив отдельных слов.

Вот так, например:

static String convert(String s) {
    String[] data = s.split(","); //разбили входную строку на кусочки, отделённые запятой

    return data[2].charAt(0) + // добавляем первую букву отчества
           "." +
           data[1].charAt(0) + // букву имени
           ". " +
           data[0] +           // фамилия целиком
           " совершил событие " +
           data[4] +           // событие
           " в " +
           data[3] +           // дата
           " году";
}
→ Ссылка