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);
}
Avete già controllato questo post? http://stackoverflow.com/questions/1144783/replacing-all-occurrences-of-a-string-in-javascript – Patricia
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. –