fix: распознавать одиночные имена и расширить правила дат и CVV/PIN

This commit is contained in:
dakocha3
2026-09-22 23:32:45 +03:00
parent 6ca880a992
commit 1cee7d0f0f
3 changed files with 113 additions and 19 deletions
@@ -132,6 +132,34 @@ public final class NameDictionary {
return false;
}
/**
* Проверяет, что фрагмент — имя, отчество или фамилия человека. Используется
* для строчных имён после ролевого слова («клиент иван иванов»), где регистр
* не подсказывает, что перед нами имя.
*/
public static boolean containsNamePart(String value) {
for (String word : value.split("\\P{L}+")) {
String lower = word.toLowerCase(Locale.ROOT);
if (GIVEN_NAMES.contains(lower)) {
return true;
}
if (isPatronymic(lower) || isSurname(lower)) {
return true;
}
}
return false;
}
/** Отчество: Иванович, Петровна, Сидоровна. */
private static boolean isPatronymic(String lower) {
return lower.matches(".*(?:ович|евич|овна|евна|ична|ичн)$");
}
/** Фамилия по словообразованию: Иванов, Петрова, Троицкий, Шевченко. */
private static boolean isSurname(String lower) {
return lower.matches(".*(?:ов|ев|ёв|ин|ын|ск(?:ий|ая|ого|ой|ом)|цк(?:ий|ая)|енко|ко|ук|юк|ян|швили|дзе)$");
}
/**
* Содержит ли текст упоминание известного человека — из сборки или дописанных
* сверху.