https://jsfiddle.net/2bxpygjr/

могу заменить в первую очередьN вхождения многих пробелов и табуляции в следующей строке:

07/12/2017  11:01 AM             21523 filename with s p a c  e  s.js

Я ожидаю следующий результат:

07/12/2017|11:01|AM|21523|filename with s p a c  e  s.js

Я знаю, не очень элегантный вариант только через вызов заменитьN раз на одной строке

.replace(/\s+/, "|").replace(/\s+/, "|").replace(/\s+/, "|");

Стоит упомянуть, что я собираюсь запустить это примерно на 1 000 000 строк, поэтому производительность имеет значение.

 Systems Rebooter10 нояб. 2017 г., 21:21
g заменит все. Но мне нужно заменить только сначалаn вхождений
 Sven Writes Code10 нояб. 2017 г., 21:23
пахнет, как вы можете использовать какую-то петлю
 Derek 朕會功夫10 нояб. 2017 г., 21:20
@stealththeninja Op хочет заменить только первые 4 вхождения в строках, оставляя пробелы в имени файла нетронутыми.

Ответы на вопрос(6)

var string = '07/12/2017  11:01 AM             21523 filename with s p a c  e  s.js',
    n = 4,
    result = string.replace(/\s+/g, s => n ? (n--, '|') : s);
    
console.log(result);

Вы можете заменить троичное выражение логическим И и ИЛИ.

var string = '07/12/2017  11:01 AM             21523 filename with s p a c  e  s.js',
    n = 4,
    result = string.replace(/\s+/g, s => n && n-- && '|' || s);
    
console.log(result);

елов. Если N статический, токен без пробелов (\S) можно использовать для сопоставления и сохранения групп между пробелами:

.replace(/\s+(\S+)\s+(\S+)\s+/, '|$1|$2|')

но, поскольку вы говорите, что хотите скорости, я бы остановился на одном:

var logLine = '07/12/2017  11:01 AM             21523 filename with s p a c  e  s.js';
var N = 4;
while(--N + 1){
  logLine = logLine.replace(/\s+/, '|');
}
console.log(logLine);

Вот на JSFiddle:https://jsfiddle.net/2bxpygjr/

Вероятно, что-то вроде этого:

var txt = "07/12/2017  11:01 AM             21523 filename with s p a c  e  s.js";

var n = 0, N = 4;
newTxt = txt.replace(/\s+/g, match => n++ < N ? "|" : match);

newTxt; // "07/12/2017|11:01|AM|21523|filename with s p a c  e  s.js"

А как насчет рекурсивной версии вашего собственного решения?

function repalceLeadSpaces(str, substitution, n) {
    n = n || 0;
    if (!str || n <= 0) {
        return str;
    }
    str = str.replace(/\s+/, substitution);
    return n === 1 ? str : repalceLeadSpaces(str, substitution, n - 1)
}

поэтому я посмотрю его и пойму, что он / она делает в нем.

var mytext = "some text separated by spaces and spaces and more spaces";
var iterationCount = 4;
while(iterationCount > 0)
  {
    mytext = mytext.replace(" ", "");
    iterationCount--;
  }
return mytext;

Ваш ответ на вопрос