2016-05-12 13 views
12

Proveniente da altri linguaggi di programmazione, String.replace() sostituisce in genere tutte le occorrenze di stringhe corrispondenti. Tuttavia, questo non è il caso con javascript/typescript. Ho trovato una serie di soluzioni sul web con javascript che utilizza regex. Ho subito problemi con questa soluzione a causa di caratteri speciali. Ho il sospetto che ci sia un modo per correggere questo con regex, ma io non sono un esperto di regex. Come molti hanno fatto prima di me, ho creato il mio metodo.In typescript, String.Replace sostituisce solo la prima occorrenza della stringa con corrispondenza. Need String.replaceAll() method

Forse ci sono modi per migliorare le prestazioni facendo uso di una classe personalizzata StringBuilder(). Accolgo qualsiasi pensiero.

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

Per aggiungere il supporto a questo metodo per la classe string ho aggiunto il seguente codice:

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

.... Dopo ri-visualizzazione di altri post, ho modificato il codice per utilizzare normale espressioni. Sarebbe interessante eseguire test delle prestazioni.

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

Avete già controllato questo post? http://stackoverflow.com/questions/1144783/replacing-all-occurrences-of-a-string-in-javascript – Patricia

+0

Sì, tra molti altri. Tuttavia, dopo averlo rivisitato, ho una migliore comprensione di come veniva usata l'espressione regolare. Ho modificato il codice sopra per rifletterlo. Per me, è una risposta più concisa. Forse potrebbe aiutare qualcun altro. –

risposta

21

a macchina, String.Replace sostituisce soltanto prima occorrenza della stringa corrispondente. Need String.replaceAll() method

Non c'è niente di speciale in TypeScript qui (after all TypeScript is just JavaScript with type annotations). JavaScript string.replace sostituisce solo la prima istanza se viene fornita una stringa. L'unico modo per ottenere la sostituzione è usare un regex con il modificatore /g.

alternativa Io proprio:

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

Sì, il metodo string.split(). Join() è breve e dolce. Tuttavia, non è possibile eseguire la ricerca/sostituzione senza distinzione tra maiuscole e minuscole. La prima volta che ho usato la regex con il modificatore/g, ha generato un pattern non valido per l'espressione regolare durante l'esecuzione del codice. Avevo bisogno di includere le sequenze di escape nel modello. 'var pattern = oldValue.replace (/ [- \ [\] \/\ {\} \ (\) \ * \ + \? \. \\\^\ $ \ |]/g," \\ $ &"); Questo è il motivo per cui mi piace includere l'intera funzione nel mio esempio La procedura è semplice e abbastanza breve da consentire –

+0

Amore che divida il join! – Drutten

+2

Proprio come riferimento, qui la chiamata di tipo TypeScript sostituisce usando regex: 'myString.replace (/ oldString/g, 'newString);' – Thomas

Problemi correlati