Diğer programlama dillerinden gelen, String.replace()
genellikle eşleşen dizelerin tüm yinelemelerini değiştirir. Ancak, bu javascript/typescript ile durum böyle değil. İnternette javascript regex kullanarak bir takım çözümler buldum. Özel karakterler nedeniyle derhal bu çözümle ilgili sorunlar yaşadım. Bu regex ile düzeltmek için bir yol olduğundan şüpheliyim, ama ben bir regex uzmanı değilim. Birçoğu benden önce yaptığı gibi, kendi yöntemimi oluşturdum.Dizinde, String.Replace yalnızca eşleşen dizenin ilk oluşumunun yerini alır. Need String.replaceAll() yöntemi
Belki de özel bir StringBuilder()
sınıfından yararlanarak performansı iyileştirmenin yolları vardır. Her türlü düşünceyi memnuniyetle karşılıyorum. string
sınıfa bu yönteme desteği eklemek için
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;
}
Aşağıdaki kodu ekledi:
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);}
.... diğer yayınları yeniden gördükten sonra, o düzenli kullanımı kod modifiye ifade. Performans testlerini yürütmek ilginç olurdu. daktilo versiyonunda
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);
}
Zaten bu yazı kontrol ettiniz mi? http://stackoverflow.com/questions/1144783/replacing-all-occurrences-of-a-string-in-javascript – Patricia
Evet, diğerleri arasında. Ancak, yeniden gözden geçirdikten sonra, normal ifadenin nasıl kullanıldığına dair daha iyi bir anlayışa sahibim. Yukarıdaki kodu yansıtacak şekilde değiştirdim. Benim için daha kısa bir cevap. Belki başka birine yardımcı olabilir. –