web-dev-qa-db-fra.com

Dans TypeScript, String.Replace remplace uniquement la première occurrence de la chaîne correspondante. Besoin de la méthode String.replaceAll ()

Provenant d'autres langages de programmation, String.replace() remplace généralement toutes les occurrences des chaînes correspondantes. Cependant, ce n'est pas le cas avec javascript/TypeScript . J'ai trouvé un certain nombre de solutions sur le Web avec javascript using regex. J'ai immédiatement eu des problèmes avec cette solution à cause de caractères spéciaux. Je soupçonne qu’il ya un moyen de corriger cela avec une expression régulière, mais je ne suis pas un expert en expression Comme beaucoup l'ont fait avant moi, j'ai créé ma propre méthode. 

Il existe peut-être des moyens d'améliorer les performances en utilisant une classe StringBuilder() personnalisée. J'accueille toutes les pensées.

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;
}

Afin d'ajouter le support de cette méthode à la classe string, j'ai ajouté le code suivant:

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);}

.... Après avoir relu d'autres articles, j'ai modifié le code pour utiliser des expressions régulières. Il serait intéressant d’exécuter des tests de performance.

 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);
}
22
James W Simms

Dans TypeScript, String.Replace remplace uniquement la première occurrence de la chaîne correspondante. Besoin de la méthode String.replaceAll ()

Il n'y a rien de spécial à TypeScript ici ( après tout, TypeScript est juste du JavaScript avec des annotations de type ). JavaScript string.replace ne remplace la première instance que si une chaîne est donnée. La seule façon d'obtenir tout remplacer est d'utiliser une variable regex avec /g.

Alternativement je fais juste: 

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

Dans mon cas, j'ai fait comme ça dans TypeScript.

this.mystr= this.mystr.replace(new RegExp('class="dec-table"', 'g'), 'class="copydec-table"');

Crédits à Comment remplacer toutes les occurrences d'une chaîne en JavaScript?

0
Ziggler