package ru.pdguard.detect; import java.util.regex.Pattern; /** * Проверка, стоит ли перед именем слово, относящее его к организации или объекту на карте. * *

«Институт Склифосовского», «Музей Тропинина», «улица Королёва» — это имена в названиях, а не * персональные данные. Отличие от списка известных людей в том, что здесь решает не само имя, а * слово перед ним: клиент по фамилии Королёв защиту не теряет, а улица Королёва под маску не * попадает. */ public final class OrganisationDetector { /** * Маркер организации вплотную перед именем. Слово может стоять в любом падеже, между ним и именем * допускается «имени» или «им.» — «Премия имени Ломоносова». */ private static final Pattern ORGANISATION_BEFORE = Pattern.compile( "(?iu:" + String.join("|", ResourceLoader.lines("/names/organisations.txt", false)) + ")\\p{L}*" + "(?:\\W{1,3}(?iu:имени|им\\.))?\\W{0,3}$", Pattern.UNICODE_CHARACTER_CLASS | Pattern.UNICODE_CASE); /** Сколько знаков перед именем просматривается в поисках маркера организации. */ private static final int ORGANISATION_LOOKBEHIND = 40; private OrganisationDetector() {} public static boolean precededByOrganisation(String text, int nameStart) { int from = Math.max(0, nameStart - ORGANISATION_LOOKBEHIND); return ORGANISATION_BEFORE.matcher(text.substring(from, nameStart)).find(); } }