Enhancement of RegExp replacement

# sion (6 years ago)

Is it possible to enhance the string.prototype.replace(regex, func) ?

By now, we can do something like this:

input.replace(/(^|_)[a-z]/g, a => a[a.length - 1].toUpperCase());

INPUT: ab_cd_ef OUTPUT: abCdEf

However, i want something more powerfull, like this:

input.replace(/your (\w+) from (\w+)/g, a => 'book', b => 'amazon’);

INPUT: your friend from china OUTPUT: your book from amazon

As you can see, I just want the replace could replace multi fragments at the same time. And I don’t think there is any conflicts with other principles of string.prototype.replace.

# Peter Jaszkowiak (6 years ago)

You do know that all capture groups are passed to the function, right? You can write your second example like this, even though the capture groups are totally useless:

input.replace(
  /your (\w+) from (\w+)/g,
  (whole, a, b) => 'your book from amazon'
);
# sion (6 years ago)

This is just a very simple example, of cause you could write it like that.

Maybe my second example is unsuitable, how about this one:

input.replace(/your \w+ from \w+/, a => a.toUpperCase(), b => b.toLowerCase());

INPUT: your friend from USA OUTPUT: your FRIEND from usa

Actually, I am not very familiar with regex, I wonder if there is any performance issue if we support this kind of feature.

# Peter Jaszkowiak (6 years ago)
input.replace(
  /your (\w+) from (\w+)/,
  (w, a, b) => `your ${a.toUpperCase()} from ${b.toLowerCase()}`
);