import java.util.*;
import java.util.regex.Pattern;
import java.time.*;
import java.time.format.*;
import java.time.temporal.ChronoField;
class Ideone
{
private static final Locale RU
= Locale.
forLanguageTag("ru-RU"); private static final Pattern MONTH_PATTERN
= Pattern.compile("^\\d+ (\\w{3,5})\\.? \\d+$", Pattern.UNICODE_CHARACTER_CLASS);
private static final Pattern NO_MONTH_PATTERN
= Pattern.compile("^(\\d+) \\w{3,5}\\.? (\\d+)$", Pattern.UNICODE_CHARACTER_CLASS);
public static LocalDate parseSloppyRussianDate
(String dateString
) { String monthAbbr
= MONTH_PATTERN.
matcher(dateString
).
replaceFirst("$1"); Month month
= Arrays.
stream(Month.
values()) .filter(m -> m.getDisplayName(TextStyle.FULL, RU).startsWith(monthAbbr))
.findAny()
.orElseThrow(() -> new DateTimeParseException("Unknown month", dateString, 3));
String withoutMonth
= NO_MONTH_PATTERN.
matcher(dateString
).
replaceFirst("$1 $2");
DateTimeFormatter dtf = new DateTimeFormatterBuilder()
.appendPattern("d u")
.parseDefaulting(ChronoField.MONTH_OF_YEAR, month.getValue())
.toFormatter(RU);
return LocalDate.parse(withoutMonth, dtf);
}
{
System.
out.
println(parseSloppyRussianDate
("27 апр. 2018")); System.
out.
println(parseSloppyRussianDate
("24 мая. 2013")); System.
out.
println(parseSloppyRussianDate
("28 фев. 2019")); }
}
aW1wb3J0IGphdmEudXRpbC4qOwppbXBvcnQgamF2YS51dGlsLnJlZ2V4LlBhdHRlcm47CmltcG9ydCBqYXZhLnRpbWUuKjsKaW1wb3J0IGphdmEudGltZS5mb3JtYXQuKjsKaW1wb3J0IGphdmEudGltZS50ZW1wb3JhbC5DaHJvbm9GaWVsZDsKCmNsYXNzIElkZW9uZQp7CiAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2NhbGUgUlUgPSBMb2NhbGUuZm9yTGFuZ3VhZ2VUYWcoInJ1LVJVIik7CiAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBQYXR0ZXJuIE1PTlRIX1BBVFRFUk4KICAgICAgICAgICAgPSBQYXR0ZXJuLmNvbXBpbGUoIl5cXGQrIChcXHd7Myw1fSlcXC4/IFxcZCskIiwgUGF0dGVybi5VTklDT0RFX0NIQVJBQ1RFUl9DTEFTUyk7CiAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBQYXR0ZXJuIE5PX01PTlRIX1BBVFRFUk4KICAgICAgICAgICAgPSBQYXR0ZXJuLmNvbXBpbGUoIl4oXFxkKykgXFx3ezMsNX1cXC4/IChcXGQrKSQiLCBQYXR0ZXJuLlVOSUNPREVfQ0hBUkFDVEVSX0NMQVNTKTsKCiAgICBwdWJsaWMgc3RhdGljIExvY2FsRGF0ZSBwYXJzZVNsb3BweVJ1c3NpYW5EYXRlKFN0cmluZyBkYXRlU3RyaW5nKSB7CiAgICAgICAgU3RyaW5nIG1vbnRoQWJiciA9IE1PTlRIX1BBVFRFUk4ubWF0Y2hlcihkYXRlU3RyaW5nKS5yZXBsYWNlRmlyc3QoIiQxIik7CiAgICAgICAgTW9udGggbW9udGggPSBBcnJheXMuc3RyZWFtKE1vbnRoLnZhbHVlcygpKQogICAgICAgICAgICAgICAgLmZpbHRlcihtIC0+IG0uZ2V0RGlzcGxheU5hbWUoVGV4dFN0eWxlLkZVTEwsIFJVKS5zdGFydHNXaXRoKG1vbnRoQWJicikpCiAgICAgICAgICAgICAgICAuZmluZEFueSgpCiAgICAgICAgICAgICAgICAub3JFbHNlVGhyb3coKCkgLT4gbmV3IERhdGVUaW1lUGFyc2VFeGNlcHRpb24oIlVua25vd24gbW9udGgiLCBkYXRlU3RyaW5nLCAzKSk7CgogICAgICAgIFN0cmluZyB3aXRob3V0TW9udGggPSBOT19NT05USF9QQVRURVJOLm1hdGNoZXIoZGF0ZVN0cmluZykucmVwbGFjZUZpcnN0KCIkMSAkMiIpOwoKICAgICAgICBEYXRlVGltZUZvcm1hdHRlciBkdGYgPSBuZXcgRGF0ZVRpbWVGb3JtYXR0ZXJCdWlsZGVyKCkKICAgICAgICAgICAgICAgIC5hcHBlbmRQYXR0ZXJuKCJkIHUiKQogICAgICAgICAgICAgICAgLnBhcnNlRGVmYXVsdGluZyhDaHJvbm9GaWVsZC5NT05USF9PRl9ZRUFSLCBtb250aC5nZXRWYWx1ZSgpKQogICAgICAgICAgICAgICAgLnRvRm9ybWF0dGVyKFJVKTsKCiAgICAgICAgcmV0dXJuIExvY2FsRGF0ZS5wYXJzZSh3aXRob3V0TW9udGgsIGR0Zik7CiAgICB9CgkKCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluIChTdHJpbmdbXSBhcmdzKSB0aHJvd3MgamF2YS5sYW5nLkV4Y2VwdGlvbgoJewogICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihwYXJzZVNsb3BweVJ1c3NpYW5EYXRlKCIyNyDQsNC/0YAuIDIwMTgiKSk7CiAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKHBhcnNlU2xvcHB5UnVzc2lhbkRhdGUoIjI0INC80LDRjy4gMjAxMyIpKTsKICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4ocGFyc2VTbG9wcHlSdXNzaWFuRGF0ZSgiMjgg0YTQtdCyLiAyMDE5IikpOwoJfQoKfQ==