В typescript String.Replace заменяет только первое совпадение строки. Нужен метод String.replaceAll()

Исходя из других языков программирования, String.replace() обычно заменяет все вхождения совпадающих строк. Однако это не относится к javascript/typescript. Я нашел несколько решений в Интернете с использованием javascript с использованием регулярного выражения. У меня сразу возникли проблемы с этим решением из-за специальных символов. Я подозреваю, что есть способ исправить это с помощью регулярного выражения, но я не специалист по регулярному выражению. Как многие из них сделали передо мной, я создал свой собственный метод.

Возможно, есть способы повысить производительность за счет использования пользовательского класса StringBuilder(). Я приветствую любые мысли.

public static Replace = function (originalString: string, oldValue: string, newValue: string, ignoreCase: boolean = false) {
    //
    // if invalid data, return the original string
    //
    if ((originalString == null) || (oldValue == null) || (newValue == null) || (oldValue.length == 0) )
        return (originalString);
    //
    // do text replacement
    //
    var dest = "";        
    var source: string = originalString;
    if (ignoreCase) 
    {
        source = source.toLocaleLowerCase();
        oldValue = oldValue.toLowerCase();
    }
    //
    // find first match
    //
    var StartPos = 0;
    var EndPos = source.indexOf(oldValue, StartPos);
    var Skip = (EndPos >= 0) ? EndPos - StartPos : source.length-StartPos;   
    //
    // while we found a matched string
    //     
    while (EndPos > -1) {
        //
        // copy original string skipped segment
        //
        if (Skip > 0) dest += originalString.substr(StartPos, Skip);            
        //
        // copy new value
        //
        dest += newValue;
        //
        // skip over old value
        //
        StartPos = EndPos + oldValue.length;
        //
        // find next match
        //
        EndPos = source.indexOf(oldValue, StartPos);
        Skip = (EndPos >= 0) ? EndPos - StartPos : source.length - StartPos;    
    }
    //
    // append the last skipped string segment from original string
    //
    if (Skip > 0) dest += originalString.substr(StartPos, Skip);   

    return dest;
}

Чтобы добавить поддержку этого метода в класс string, я добавил следующий код:

interface String { EZReplace(oldValue: string, newValue: string, ignorCase?: boolean): string; }

String.prototype.EZReplace = function (oldValue: string, newValue: string, ignorCase: boolean = false) {
return EZUtil.Replace(this, oldValue, newValue, ignorCase);}

.... После повторного просмотра других сообщений я модифицировал код для использования регулярных выражений. Было бы интересно выполнить тесты производительности.

 public static Replace = function (originalString: string, oldValue: string, newValue: string, ignoreCase: boolean = false) {
    //
    // if invalid data, return the original string
    //
    if ((originalString == null) || (oldValue == null) || (newValue == null) || (oldValue.length == 0))
        return (originalString);
    //
    // set search/replace flags
    //
    var Flags: string = (ignoreCase) ? "gi" : "g";
    //
    // apply regex escape sequence on pattern (oldValue)
    //
    var pattern = oldValue.replace(/[-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g, "\\$&");
    //
    // replace oldValue with newValue
    //
    var str = originalString.replace(new RegExp(pattern, Flags), newValue);
    return (str);
}

Ответ 1

В typescript String.Replace заменяет только первое совпадение строки. Необходим метод String.replaceAll()

Здесь нет ничего особенного TypeScript (после TypeScript - это просто JavaScript с аннотациями типов). JavaScript string.replace заменяет только первый экземпляр, если задана строка. Единственный способ заменить все - использовать модификатор regex с /g.

В качестве альтернативы я просто делаю:

somestring.split('oldString').join('newString');