Больше нравится вариант с разделением на слова, т.к. позволяет разнести логику. Одна часть делит предложение, другая — обрабатывает слова. Напрягает только проверка
len > 0 ? ..., но от нее, наверное, никуда не деться.
function asteriskify(word, letters, type) {
type = type || '*';
var asteriskesNumber = word.length - Math.abs(letters);
var asteriskes = (asteriskesNumber > 0 ? (new Array(asteriskesNumber + 1)).join(type) : '');
if (letters > 0) {
return word.substring(0, letters) + asteriskes;
} else {
return asteriskes + word.substring(word.length + letters, word.length)
}
}
var str = 'Не путайте Яндекс.Деньги с Гоголь-Моголем';
var REGEXP = /[\wа-яёА-ЯЁ]+/g;
var out1 = str.replace(REGEXP, function(word) {
return asteriskify(word, 5);
})
var out2 = str.replace(REGEXP, function(word) {
return asteriskify(word, -4);
})
alert(out1 +'\n'+ out2)