fix: sonarQube замечания
This commit is contained in:
@@ -51,6 +51,9 @@ public final class NameDictionary {
|
||||
|
||||
private static final Path EXTERNAL_FILE = Path.of("config/well-known.txt");
|
||||
|
||||
/** Разделитель слов: любая последовательность не-буквенных символов. */
|
||||
private static final String WORD_SPLIT = "\\P{L}+";
|
||||
|
||||
/** Порядковые числительные в имени правителя: «Пётр Первый», «Екатерина Вторая». */
|
||||
private static final String REGNAL_ORDINALS =
|
||||
"перв|втор|трет|четв[её]рт|пят|шест|седьм|восьм|девят|десят";
|
||||
@@ -111,7 +114,7 @@ public final class NameDictionary {
|
||||
* приходится не больше четырёх обращений к хеш-таблице.
|
||||
*/
|
||||
public static boolean containsGivenName(String value) {
|
||||
for (String word : value.split("\\P{L}+")) {
|
||||
for (String word : value.split(WORD_SPLIT)) {
|
||||
String lower = word.toLowerCase(Locale.ROOT);
|
||||
// Точное совпадение с основой сильнее всего: «Яков» оканчивается на «ов»,
|
||||
// но это имя, а не фамилия.
|
||||
@@ -138,7 +141,7 @@ public final class NameDictionary {
|
||||
* не подсказывает, что перед нами имя.
|
||||
*/
|
||||
public static boolean containsNamePart(String value) {
|
||||
for (String word : value.split("\\P{L}+")) {
|
||||
for (String word : value.split(WORD_SPLIT)) {
|
||||
String lower = word.toLowerCase(Locale.ROOT);
|
||||
if (GIVEN_NAMES.contains(lower)) {
|
||||
return true;
|
||||
@@ -155,9 +158,19 @@ public final class NameDictionary {
|
||||
return lower.matches(".*(?:ович|евич|овна|евна|ична|ичн)$");
|
||||
}
|
||||
|
||||
/** Фамилия по словообразованию: Иванов, Петрова, Троицкий, Шевченко. */
|
||||
/** Окончания, по которым слово похоже на фамилию: Иванов, Петрова, Троицкий, Шевченко. */
|
||||
private static final Set<String> SURNAME_ENDINGS = Set.of(
|
||||
"ов", "ев", "ёв", "ин", "ын", "ский", "ская", "ского", "ской", "ском",
|
||||
"цкий", "цкая", "енко", "ко", "ук", "юк", "ян", "швили", "дзе");
|
||||
|
||||
/** Фамилия по словообразованию. Набор окончаний вместо regex: проще и без CANON_EQ. */
|
||||
private static boolean isSurname(String lower) {
|
||||
return lower.matches(".*(?:ов|ев|ёв|ин|ын|ск(?:ий|ая|ого|ой|ом)|цк(?:ий|ая)|енко|ко|ук|юк|ян|швили|дзе)$");
|
||||
for (String ending : SURNAME_ENDINGS) {
|
||||
if (lower.endsWith(ending)) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -174,7 +187,7 @@ public final class NameDictionary {
|
||||
return true;
|
||||
}
|
||||
Set<String> stems = currentWellKnownStems();
|
||||
for (String word : value.split("\\P{L}+")) {
|
||||
for (String word : value.split(WORD_SPLIT)) {
|
||||
String lower = word.toLowerCase(Locale.ROOT);
|
||||
for (int length = lower.length(); length > 0; length--) {
|
||||
if (stems.contains(lower.substring(0, length))) {
|
||||
@@ -235,7 +248,6 @@ public final class NameDictionary {
|
||||
}
|
||||
}
|
||||
return Set.copyOf(merged);
|
||||
},
|
||||
BUNDLED_WELL_KNOWN_STEMS);
|
||||
});
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user