user1775888
user1775888

Reputation: 3303

regex replace only a part of the match

I want to replace only a part of the string of a regex pattern match. I found this answer but I don't get it...
How do I use substitution?

Example of what I want: keep the first slug digit, only replace others

/09/small_image/09x/ > /09/thumbnail/
1st: unknown digit
2nd: "small_image"
3rd: unknown digit + "x"

Here is what I have so far:

var regexPattern = /\/\d\/small\_image\/\d*x/;
var regexPattern = /\/\d\/(small\_image\/\d*x)$1/;  ??

var result = regexPattern.test(str);
if (result) {
  str = str.replace(regexPattern, 'thumbnail');
}

Upvotes: 13

Views: 12971

Answers (2)

Syntac
Syntac

Reputation: 1767

Go with

var regexPattern = /(\/\d+\/)small\_image\/\d*x/;

and

str = str.replace(regexPattern, '$1thumbnail');

First, you were missing the +. Because 09 are two digits, you need the regexp to match one or more digits (\ḑ would be exactly one). This is accomplished by \d+
Second, everything you match is being removed at first. To get the /09/ part back afterwards, you have to remember it by putting it into brackets in the regexp (...) and afterwards reference it in the replacement via $1
One could as well create other groups and reference them by $2,$3 ...

Upvotes: 2

nnnnnn
nnnnnn

Reputation: 150020

var input = "/09/small_image/09x/";
var output = input.replace(/(\/\d+\/)small_image\/\d*x/, "$1thumbnail");
console.log(output);

Explanation:

Put the part you want to keep in parentheses, then refer to that as $1 in the replacement string - don't put $1 in your regex. So (\/\d+\/) means to match a forward slash followed by one or more digits, followed by another forward slash.

(Note that you don't need to escape underscores in a regex.)

Upvotes: 19

Related Questions