Помогите доработать регулярное выражение с группами
Вводится строка следующего вида:
Фамилия,Имя,Отчество,Год,Событие
Необходимо написать метод 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 шт):
Решение с регулярным выражением
По-моему у вас неправильная регулярка. Она вообще ничего не парсит. Посмотрите, вот здесь всё работает:
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] + // дата
" году";
}