I would like to replace all the dots inside the HTML tag <code>
with the word " dot ".
If I do like this it will change only the first occurrence. I would like to change them all.
const str = 'Some text <code >this.is.a.class</code> and <code>this.another.thing</code>';
const res = str.replaceAll(/(<code[^>]*>.*?)(\.)(.*?<\/code>)/g, "$1 dot $3");
console.log(res);
// Some text <code >this dot is.a.class</code> and <code>this dot another.thing</code>
Why it is changing only the first?
CodePudding user response:
You can use a String#replace
method with a callback function:
const str = 'Some text <code >this.is.a.class</code> and <code>this.another.thing</code>';
const res = str.replaceAll(/(<code[^>]*>)([\s\S]*?<\/code>)/g, (_,x,y) => `${x}${y.replaceAll(".", " dot ")}`);
console.log(res);
The (<code[^>]*>)([\s\S]*?<\/code>)
regex matches and captures the open code
tag into Group 1 (x
variable), and then captures any zero or more chars as few as possible and then the close code
tag into Group 2 (y
variable). When replacing, all dots in y
(Group 2 captured value) are replaced with DOT
inside the arrow function.
Note that [\s\S]
matches any chars including line break chars, .
does not match line break chars (at least by default).