2016-05-12 10 views
12

Zwykle zastępując wszystkie wystąpienia pasujących ciągów, pochodzących z innych języków programowania, String.replace() zwykle zastępuje wszystkie wystąpienia pasujących ciągów. Jednak nie jest tak w przypadku javascript/typescript. Znalazłem wiele rozwiązań w Internecie z javascript z wykorzystaniem regex. Natychmiast miałem problemy z tym rozwiązaniem ze względu na specjalne znaki. Podejrzeń, że istnieje sposób, aby poprawić to za pomocą regex, ale nie jestem ekspertem od regex. Jak wielu zrobiło przede mną, stworzyłem własną metodę.W maszynopisie String.Replace zastępuje tylko pierwsze wystąpienie dopasowanego ciągu. Need String.replaceAll() metoda

Być może istnieją sposoby na poprawę wydajności, korzystając z niestandardowej klasy StringBuilder(). Witam wszelkie myśli.

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

W celu dodania wsparcia dla tej metody do klasy string I dodaje następujący kod:

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

.... Po ponownym oglądania innych stanowisk, to zmodyfikowany kod do korzystania z regularnych wyrażenia. Interesujące byłoby wykonanie testów wydajności.

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

Czy już sprawdzone ten wpis? http://stackoverflow.com/questions/1144783/replacing-all-occurrences-of-a-string-in-javascript – Patricia

+0

Tak, wśród wielu innych. Jednak po ponownym jej przejrzeniu lepiej rozumiem, w jaki sposób używane jest wyrażenie regularne. Zmodyfikowałem powyższy kod, aby to odzwierciedlić. Dla mnie jest to bardziej zwięzła odpowiedź. Być może może to pomóc komuś innemu. –

Odpowiedz

21

W maszynopisie, string.replace zastąpi tylko pierwsze wystąpienie dopasowane ciąg. Potrzebujesz metody

String.replaceAll() Nie ma nic szczególnego do maszynopis tutaj (after all TypeScript is just JavaScript with type annotations). JavaScript string.replace zastępuje tylko pierwszą instancję, jeśli podano ciąg znaków. Jedynym sposobem na zastąpienie wszystkiego jest użycie modyfikatora regex z /g.

Ewentualnie po prostu zrobić:

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

Tak, metoda String.split(). Join() jest krótka i słodka. Jednak nie można wykonać wyszukiwania/zamiany z uwzględnieniem wielkości liter. Kiedy po raz pierwszy użyłem wyrażenia regularnego z modyfikatorem/g, wygenerowałem niepoprawny wzorzec dla wyrażenia regularnego podczas wykonywania kodu. Musiałem włączyć sekwencje specjalne do wzoru. 'var pattern = oldValue.replace (/ [- \ [\] \/\ {\} \ (\) \ * \ + \? \. \\\^\ $ \ |]/g," \\ $ &"); ' Dlatego właśnie chciałbym włączyć całą funkcję do mojego przykładu.Procedura jest prosta i wystarczająco krótka, aby na to zezwolić –

+0

Uwielbiam to dzielić scalanie rzeczy! – Drutten

+2

Podobnie jak referencja, tutaj TypeScript zamień wywołanie za pomocą regex: 'myString.replace (/ oldString/g, 'newString);' – Thomas

Powiązane problemy