为何正则仅替换<code>标签内首个英文句号?如何实现全替换?
为什么仅替换了
标签内的首个句号? 你的正则表达式逻辑存在问题,导致每个标签块里只处理第一个句号:
- 你写的正则
/(<code[^>]*>.*?)(\.)(.*?<\/code>)/g,是匹配整个标签结构,但只捕获其中第一个出现的句号。.*?是非贪婪匹配,会从标签起始位置开始,找到第一个.就停止匹配,然后把这个.替换成dot,剩下的内容(包括后续的.)被归到$3里,所以每个块只会被处理一次,自然只替换第一个句号。 - 这里的全局标志
g只是让正则匹配页面中所有的标签块,而非在单个块内部全局替换句号。
正确实现方式
可以用嵌套替换:先匹配所有标签块,再对每个块内部的所有句号做全局替换:
const str = 'Some text <code class="foo">this.is.a.class</code> and <code>this.another.thing</code>';
const res = str.replaceAll(/<code[^>]*>.*?<\/code>/g, match => {
return match.replace(/\./g, ' dot ');
});
console.log(res);
// 输出结果:Some text <code class="foo">this dot is dot a dot class</code> and <code>this dot another dot thing</code>
这个写法的逻辑是:外层正则负责定位所有标签块,对每个匹配到的块,用内部的replace(/\./g, ' dot ')完成块内所有句号的替换,这样就能覆盖所有需要替换的内容了。
内容的提问来源于stack exchange,提问作者47ndr
相关产品推荐
相关产品推荐

