如何仅替换捕获的组?

2022-08-30 00:04:39

我在字符串之前和之后都有HTML代码:

name="some_text_0_some_text"

我想用类似的东西替换:0!NEW_ID!

所以我做了一个简单的正则表达式:

.*name="\w+(\d+)\w+".*

但是我不明白如何完全替换捕获的块。

有没有办法用其他字符串替换捕获的结果,如($ 1)?

结果将是:

name="some_text_!NEW_ID!_some_text"

答案 1

解决方案是为前面和后面的文本添加捕获:

str.replace(/(.*name="\w+)(\d+)(\w+".*)/, "$1!NEW_ID!$3")

答案 2

现在Javascript已经看起来很好(截至ES2018),在较新的环境中,你可以在这些情况下完全避免组。相反,先看看你正在捕获的组之前发生了什么,并预先看看后面发生了什么,然后用以下几句话替换:!NEW_ID!

const str = 'name="some_text_0_some_text"';
console.log(
  str.replace(/(?<=name="\w+)\d+(?=\w+")/, '!NEW_ID!')
);

使用此方法,完全匹配只是需要更换的部件。

  • (?<=name="\w+)- 查找后跟单词字符(幸运的是,在 Javascript 中,查找后跟不必是固定宽度!name="
  • \d+- 匹配一个或多个数字 - 模式中唯一不在查找中的部分,字符串中唯一将在结果匹配中的部分
  • (?=\w+")- 查找单词字符,后跟" `

请记住,外观隐藏是相当新的。它适用于V8的现代版本(包括Chrome,Opera和Node),但不适用于大多数其他环境,至少现在还不行。因此,虽然您可以在 Node 和您自己的浏览器中可靠地使用 lookbehind(如果它在 V8 的现代版本上运行),但随机客户端(如在公共网站上)尚未充分支持它。