Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

String.Replace only replaces first occurrence of matched string. How to replace *all* occurrences?

Coming from other programming languages, String.replace() typically replaces all occurrences of matching strings. However, that is not the case with javascript/typescript. I found a number of solutions on the web with javascript utilizing regex. I immediately had issues with this solution because of special characters. I suspect there is a way to correct this with regex, but I am not a regex expert. As many have done before me, I created my own method.

Perhaps there are ways to improve performance by making use of a custom StringBuilder() class. I welcome any thoughts.

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

In order to add support to this method to the string class I added the following code:

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

....After re-viewing other posts, I modified the code to use regular expressions. It would be interesting to execute performance tests.

 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); } 
like image 965
James W Simms Avatar asked May 12 '16 21:05

James W Simms


People also ask

Does string replace replacing all occurrences?

The String type provides you with the replace() and replaceAll() methods that allow you to replace all occurrences of a substring in a string and return the new version of the string.

How do you replace the first occurrence of a character in a string?

Use the replace() method to replace the first occurrence of a character in a string. The method takes a regular expression and a replacement string as parameters and returns a new string with one or more matches replaced.

Which function is used to replaces all occurrences of the search string with the replacement string?

Replace(String, String) Returns a new string in which all occurrences of a specified string in the current instance are replaced with another specified string.

Does replace remove all occurrences?

After execution, the replace() method returns a copy of the string that is given as input. In the output string, all the characters are replaced with the new character. To remove all the occurrences of a given character from a string, we will invoke the replace() method on the string.


2 Answers

In typescript, String.Replace only replaces first occurrence of matched string. Need String.replaceAll() method

There is nothing special to TypeScript here (after all TypeScript is just JavaScript with type annotations). JavaScript string.replace only replaces the first instance if given a string. Only way to get replace all is to use a regex with /g modifier.

Alternatively I just do:

somestring.split('oldString').join('newString'); 
like image 187
basarat Avatar answered Sep 25 '22 02:09

basarat


In my case I did like this in TypeScript.

this.mystr= this.mystr.replace(new RegExp('class="dec-table"', 'g'), 'class="copydec-table"'); 

Credits to How to replace all occurrences of a string in JavaScript?

like image 29
Ziggler Avatar answered Sep 25 '22 02:09

Ziggler