Как дополнить регулярное выражение

При запросе нужно маскировать ФИО - удалять все знаки для фамилии и отчества, кроме первого и двух последних, вместо удалённых символов показывать три «звездочки». Для поля, имеющего до 7-ми символов включительно, удалять все знаки кроме первого. Имя не маскируется.

Пример:

Входные даннные:

  1. Иванов Иван Иванович
  2. Ли Иван Иванович

Ожидаемый результат:

  1. И*** Иван И***ич
  2. Л* Иван И***ич

Сейчас есть только такая регулярка, которая заменяет все символы на звездочки, кроме первого и последнего. Не учитывая три поля + параметры маскирования.

([a-zA-Zа-яА-Я-\s\.])[a-zA-Zа-яА-Я-\s\.]+([a-zA-Zа-яА-Я-\s\.]{2}) 

Ответы (1 шт):

Автор решения: Алексей Р

Не идеально, но на тестовых примерах отрабатывает. Наверняка можно улучшить. Состоит из двух частей через ИЛИ |:

  • для отчества: позитивный просмотр назад на 1 словарный символ (\w), далее 1+ словарных символов, после которых (позитивный просмотр вперед) должно быть 2 словарных символа и конец строки;
  • для фамилии: позитивный просмотр назад на предмет начала строки и одного словарного символа, далее 1+ словарных символов.

Найденное заменить на ***. И не забыть включить режим юникода для правильной интерпретации \w для кириллицы.

(?<=\w)\w+(?=\w{2}$)|(?<=^\w)\w+

Демо

При необходимости \w можно заменить на \p{L}, т.к. \w содержит еще 0-9 и _:

(?<=\p{L})\p{L}+(?=\p{L}{2}$)|(?<=^\p{L})\p{L}+
→ Ссылка