2016-05-12 12 views
12

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

Zaten bu yazı kontrol ettiniz mi? http://stackoverflow.com/questions/1144783/replacing-all-occurrences-of-a-string-in-javascript – Patricia

+0

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. –

cevap

21

, String.Replace yalnızca eşleşen dize ilk geçtiği yerini alır. Need String.replaceAll() yöntemi

Burada TypeScript'e özel bir şey yok (after all TypeScript is just JavaScript with type annotations). JavaScript string.replace sadece bir dize verilirse ilk örneği değiştirir. Tümünü değiştirmenin tek yolu, /g değiştiricisiyle regex kullanmaktır.

Alternatif ben sadece yapın:

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

Evet, String.split(). Join() yöntemi kısa ve tatlı. Ancak, büyük/küçük harf duyarlı olmayan arama/değiştirme yapmak mümkün değildir. Düzenli ifadeyi/g değiştiricisiyle ilk kez kullandığımda, kod yürütme sırasında düzenli ifade için geçersiz bir desen oluşturdu. Kaçış dizilerini desene dahil etmem gerekiyordu. 'var pattern = oldValue.replace (/ [- \ [\] \/\ {\} \ (\) \ * \ + \? \. \\\^\ $ \ |]/g," \\ $ &"); ' Bu nedenle, tüm işlevi benim örneğime dahil etmeyi seviyorum.Prosedür, basit ve izin verecek kadar kısa –

+0

Bölünmüş öğeleri birleştirmeye bayıl! – Drutten

+2

Referans olarak, burada TypeScript regex kullanarak aramayı değiştirin: myString.replace (/ oldString/g, 'newString); ' – Thomas

İlgili konular