Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How can I replace multiple characters in a string?

I want to create a regex with following logic: 1., If string contains T replace it with space 2., If string contains Z remove Z

I wrote two regex already, but I can't combine them:

string.replace(/\T/g,' ') && string.replace(/\Z/g,'');

EDIT: I want the regex code to be shorter

like image 208
Runtime Terror Avatar asked Jun 02 '17 09:06

Runtime Terror


People also ask

How do I replace multiple characters in a string in SQL?

Using the REPLACE() function will allow you to change a single character or multiple values within a string, whether working to SELECT or UPDATE data.


1 Answers

Doesn't seem this even needs regex. Just 2 chained replacements would do.

var str = '[T] and [Z] but not [T] and [Z]';
var result = str.replace('T',' ').replace('Z','');
console.log(result);

However, a simple replace only replaces the first occurence.
To replace all, regex still comes in handy. By making use of the global g flag.
Note that the characters aren't escaped with \. There's no need.

var str = '[T] and [Z] and another [T] and [Z]';
var result = str.replace(/T/g,' ').replace(/Z/g,'');
console.log(result);

// By using regex we could also ignore lower/upper-case. (the i flag)
// Also, if more than 1 letter needs replacement, a character class [] makes it simple.
var str2 = '(t) or (Ⓣ) and (z) or (Ⓩ). But also uppercase (T) or (Z)';
var result2 = str2.replace(/[tⓉ]/gi,' ').replace(/[zⓏ]/gi,'');
console.log(result2);

But if the intention is to process really big strings, and performance matters?
Then I found out in another challenge that using an unnamed callback function inside 1 regex replace can prove to be faster. When compared to using 2 regex replaces.

Probably because if it's only 1 regex then it only has to process the huge string once.

Example snippet:

console.time('creating big string');
var bigstring = 'TZ-'.repeat(2000000);
console.timeEnd('creating big string');

console.log('bigstring length: '+bigstring.length);

console.time('double replace big string');
var result1 = bigstring.replace(/[t]/gi,'X').replace(/[z]/gi,'Y');
console.timeEnd('double replace big string');

console.time('single replace big string');
var result2 = bigstring.replace(/([t])|([z])/gi, function(m, c1, c2){
         if(c1) return 'X'; // if capture group 1 has something
         return 'Y';
       });
console.timeEnd('single replace big string');

var smallstring = 'TZ-'.repeat(5000);

console.log('smallstring length: '+smallstring.length);

console.time('double replace small string');
var result3 = smallstring.replace(/T/g,'X').replace(/Z/g,'Y');
console.timeEnd('double replace small string');

console.time('single replace small string');
var result4 = smallstring.replace(/(T)|(Z)/g, function(m, c1, c2){
         if(c1) return 'X'; 
         return 'Y';
       });
console.timeEnd('single replace small string');
like image 65
LukStorms Avatar answered Sep 18 '22 05:09

LukStorms