Замените последнее слово звездочкой или последние два слова - PullRequest
2 голосов
/ 17 октября 2019

Мне нужно скрыть фамилию людей. Для лиц с тремя словами в названии просто скрыть последнее слово, ej:

Laura Torres Bermudez

должно быть

Laura Torres ********

, а для

Maria Fernanda Gonzales Lopez

должно быть

Maria Fernanda ******** *****

Я думаю, что это два регулярных выражения, потому что в зависимости от количества слов будет применено регулярное выражение.

Я знаю, \w+ заменяет все слова на одну звездочку, а (?!\s). Я могу заменить символы, кроме пробелов. Я надеюсь, что вы можете мне помочь. Спасибо.

Это мой пример: https://regex101.com/r/yW4aZ3/942

Ответы [ 3 ]

3 голосов
/ 17 октября 2019

Попробуйте это:

(?<=\w+\s+\w+\s+.*)[^\s]

Объяснение:

  • ?<= - отрицательный взгляд назад - сопоставлять только вхождения, предшествующие указанному шаблону
  • [^\s]/ сопоставить все, кроме пробелов (то, что вы использовали - (?!\s). - на самом деле странное использование lookahead - «смотреть на следующий символ, если это не пробел; затем сопоставить любой символ»)
  • summary: заменить любоенепробельный символ пробела, которому предшествуют как минимум две последовательности букв (\w) и пробелов (\s).

Просто обратите внимание, что он не будет ничего скрывать для людей с двумя словамив их имени (что часто встречается во многих странах).

Кроме того, для этого инструмента тестирования необходимо немного изменить регулярное выражение, чтобы оно соответствовало одному имени в строке - см. https://regex101.com/r/yW4aZ3/943 (^ былодобавлен для совпадения с начала каждой строки, и был установлен флаг «многострочный»).

2 голосов
/ 18 октября 2019

Заинтересовавшись, можно ли это сделать в JavaScript без обратного вызова, я придумал

str = str.replace(/^(\w+\W+\w+\W+\b)\w?|(?!^)(\W*)\w/gy, '$1$2*');

См. Эту демонстрацию на regex101

Идея может показаться немного запутанной, но, похоже, работает нормально. Это должно произойти с ошибкой на одном или двух словах, но начаться, как только появляется символ слова после первых двух слов. Важно использовать флаг sticky y, который аналогичен якору \G (продолжить при последнем совпадении), но всегда должен начинаться.

Чтобы не добавлять дополнительную звездочку,... \b)\w? ... часть после первых двух слов имеет важное значение. Граница слова заставит начать третье слово, но первая группа захвата закрывается после \b, и первый символ третьего слова будет использован, но не захвачен для правильного соответствиячисло звездочек.

Вторая группа захвата с правой стороны чередования будет фиксировать любые необязательные несловарные символы , появляющиеся между любыми словами после третьего.

var strs = ['Foo', 'Foo Bar B', 'Laura Torres Bermudez', 'Maria Fernanda Gonzales Lopez'];
strs = strs.map(str => str.replace(/^(\w+\W+\w+\W+\b)\w?|(?!^)(\W*)\w/gy, '$1$2*'));
console.log(strs);
2 голосов
/ 17 октября 2019

A Решение JavaScript , которое не использует расширенные функции регулярных выражений ECMAScript 2018:

s = s.replace(/^(\S+\s+\S+)([\s\S]*)/, function($0, $1, $2) {return $1 + $2.replace(/\S/g, '*');})

Подробности:

  • ^ - началострока
  • (\S+\s+\S+) - группа 1: один или несколько непробельных символов, 1 или несколько пробелов, а затем 1 или несколько непробельных символов
  • ([\s\S]*) - группа 2: любой 1 или болееchars.

Заменяется содержимое группы 1, а содержимое группы 2 с каждым непробельным символом заменяется звездочкой.

Java-решение :

s = s.replaceAll("(\\G(?!^)\\s*|^\\S+\\s+\\S+\\s+)\\S", "$1*");

См. Демонстрационный пример регулярных выражений

Подробности

  • (\G(?!^)\s*|^\S+\s+\S+\s+) - Группа 1: либо конец, либо конецпредыдущего совпадения (\G(?!^)) и 0 или более пробелов или (|) 1+ без пробелов, 1+ пробелов и снова 1+ без пробелов, 1+ пробелов в начале строки
  • \S - непробельный символ.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...