/* package whatever; // don't place package name! */
import java.util.regex.*;
import java.lang.*;
import java.time.*;
import java.time.format.*;
/* Name of the class has to be "Main" only if the class is public. */
class Ideone
{
private static DateTimeFormatter DMY = new DateTimeFormatterBuilder()
.appendOptional(DateTimeFormatter.ofPattern("dd-MM[-uuuu]"))
.appendOptional(DateTimeFormatter.ofPattern("dd/MM[/uuuu]"))
.toFormatter().withResolverStyle(ResolverStyle.STRICT);
/* outra opção seria
new DateTimeFormatterBuilder()
.optionalStart()
.appendPattern("dd-MM[-uuuu]")
.optionalEnd()
.optionalStart()
.appendPattern("dd/MM[/uuuu]")
.optionalEnd()
.toFormatter().withResolverStyle(ResolverStyle.STRICT);
*/
private static Pattern POSSIBLE_DATE_REGEX = Pattern.compile("\\b\\d{2}[-/]\\d{2}([-/]\\d{4})?\\b");
Matcher matcher = POSSIBLE_DATE_REGEX.matcher(text);
if (matcher.find()) { // se encontrou, valida a data
String possivelData
= matcher.
group(); try {
DMY.parseBest(possivelData, LocalDate::from, MonthDay::from);
} catch (DateTimeParseException e) {
// data inválida (se quiser, imprima o erro: System.out.println("Erro: " + e.getMessage());
return null;
}
return possivelData;
}
// se não encontrou, retorna null
return null;
}
{
final String text1
= "Foo bar foo bar foo bar 29/01/2021 foo bar foo bar"; final String text2
= "Foo bar foo bar 29-01-2021 foo bar foo bar"; final String text3
= "Foo bar foo bar 29/01 foo bar foo bar"; final String text4
= "Foo bar foo bar 29-01 foo bar foo bar";
System.
out.
println(getDate
(text1
)); // 29/01/2021 System.
out.
println(getDate
(text2
)); // 29-01-2021 System.
out.
println(getDate
(text3
)); // 29/01 System.
out.
println(getDate
(text4
)); // 29-01 System.
out.
println(getDate
("29.12")); }
}
LyogcGFja2FnZSB3aGF0ZXZlcjsgLy8gZG9uJ3QgcGxhY2UgcGFja2FnZSBuYW1lISAqLwoKaW1wb3J0IGphdmEudXRpbC5yZWdleC4qOwppbXBvcnQgamF2YS5sYW5nLio7CmltcG9ydCBqYXZhLnRpbWUuKjsKaW1wb3J0IGphdmEudGltZS5mb3JtYXQuKjsKCi8qIE5hbWUgb2YgdGhlIGNsYXNzIGhhcyB0byBiZSAiTWFpbiIgb25seSBpZiB0aGUgY2xhc3MgaXMgcHVibGljLiAqLwpjbGFzcyBJZGVvbmUKewoJcHJpdmF0ZSBzdGF0aWMgRGF0ZVRpbWVGb3JtYXR0ZXIgRE1ZID0gbmV3IERhdGVUaW1lRm9ybWF0dGVyQnVpbGRlcigpCiAgICAgICAgLmFwcGVuZE9wdGlvbmFsKERhdGVUaW1lRm9ybWF0dGVyLm9mUGF0dGVybigiZGQtTU1bLXV1dXVdIikpCiAgICAgICAgLmFwcGVuZE9wdGlvbmFsKERhdGVUaW1lRm9ybWF0dGVyLm9mUGF0dGVybigiZGQvTU1bL3V1dXVdIikpCiAgICAgICAgLnRvRm9ybWF0dGVyKCkud2l0aFJlc29sdmVyU3R5bGUoUmVzb2x2ZXJTdHlsZS5TVFJJQ1QpOwogICAgICAgIC8qIG91dHJhIG9ww6fDo28gc2VyaWEKICAgICAgICBuZXcgRGF0ZVRpbWVGb3JtYXR0ZXJCdWlsZGVyKCkKICAgICAgICAub3B0aW9uYWxTdGFydCgpCiAgICAgICAgLmFwcGVuZFBhdHRlcm4oImRkLU1NWy11dXV1XSIpCiAgICAgICAgLm9wdGlvbmFsRW5kKCkKICAgICAgICAub3B0aW9uYWxTdGFydCgpCiAgICAgICAgLmFwcGVuZFBhdHRlcm4oImRkL01NWy91dXV1XSIpCiAgICAgICAgLm9wdGlvbmFsRW5kKCkKICAgICAgICAudG9Gb3JtYXR0ZXIoKS53aXRoUmVzb2x2ZXJTdHlsZShSZXNvbHZlclN0eWxlLlNUUklDVCk7CiAgICAgICAgKi8KICAgIHByaXZhdGUgc3RhdGljIFBhdHRlcm4gUE9TU0lCTEVfREFURV9SRUdFWCA9IFBhdHRlcm4uY29tcGlsZSgiXFxiXFxkezJ9Wy0vXVxcZHsyfShbLS9dXFxkezR9KT9cXGIiKTsKCiAgICBzdGF0aWMgU3RyaW5nIGdldERhdGUoU3RyaW5nIHRleHQpIHsKICAgICAgICBNYXRjaGVyIG1hdGNoZXIgPSBQT1NTSUJMRV9EQVRFX1JFR0VYLm1hdGNoZXIodGV4dCk7CiAgICAgICAgaWYgKG1hdGNoZXIuZmluZCgpKSB7IC8vIHNlIGVuY29udHJvdSwgdmFsaWRhIGEgZGF0YQogICAgICAgICAgICBTdHJpbmcgcG9zc2l2ZWxEYXRhID0gbWF0Y2hlci5ncm91cCgpOwogICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgRE1ZLnBhcnNlQmVzdChwb3NzaXZlbERhdGEsIExvY2FsRGF0ZTo6ZnJvbSwgTW9udGhEYXk6OmZyb20pOwogICAgICAgICAgICB9IGNhdGNoIChEYXRlVGltZVBhcnNlRXhjZXB0aW9uIGUpIHsKICAgICAgICAgICAgICAgIC8vIGRhdGEgaW52w6FsaWRhIChzZSBxdWlzZXIsIGltcHJpbWEgbyBlcnJvOiBTeXN0ZW0ub3V0LnByaW50bG4oIkVycm86ICIgKyBlLmdldE1lc3NhZ2UoKSk7CiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gcG9zc2l2ZWxEYXRhOwogICAgICAgIH0KCiAgICAgICAgLy8gc2UgbsOjbyBlbmNvbnRyb3UsIHJldG9ybmEgbnVsbAogICAgICAgIHJldHVybiBudWxsOwogICAgfQoKCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluIChTdHJpbmdbXSBhcmdzKSB0aHJvd3MgamF2YS5sYW5nLkV4Y2VwdGlvbgoJewogICAgICAgIGZpbmFsIFN0cmluZyB0ZXh0MSA9ICJGb28gYmFyIGZvbyBiYXIgZm9vIGJhciAyOS8wMS8yMDIxIGZvbyBiYXIgZm9vIGJhciI7CiAgICAgICAgZmluYWwgU3RyaW5nIHRleHQyID0gIkZvbyBiYXIgZm9vIGJhciAyOS0wMS0yMDIxIGZvbyBiYXIgZm9vIGJhciI7CiAgICAgICAgZmluYWwgU3RyaW5nIHRleHQzID0gIkZvbyBiYXIgZm9vIGJhciAyOS8wMSBmb28gYmFyIGZvbyBiYXIiOwogICAgICAgIGZpbmFsIFN0cmluZyB0ZXh0NCA9ICJGb28gYmFyIGZvbyBiYXIgMjktMDEgZm9vIGJhciBmb28gYmFyIjsKCiAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKGdldERhdGUodGV4dDEpKTsgLy8gMjkvMDEvMjAyMQogICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihnZXREYXRlKHRleHQyKSk7IC8vIDI5LTAxLTIwMjEKICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oZ2V0RGF0ZSh0ZXh0MykpOyAvLyAyOS8wMQogICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihnZXREYXRlKHRleHQ0KSk7IC8vIDI5LTAxCiAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKGdldERhdGUoIjI5LjEyIikpOwoJfQp9