Заинтересовавшись, можно ли это сделать в 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);