JS Regex,如何仅替换捕获的组?

时间:2010-10-17 19:38:20

标签: javascript regex

好的问题很简单。 我正在寻找像这样的字符串:

name="some_text_0_some_text"

我在上面的字符串之前和之后都有HTML代码。

现在我想用以下内容替换0:!NEW_ID!

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

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

但是我没有看到如何专门替换捕获的块。

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

结果将是:

name="some_text_!NEW_ID!_some_text"

感谢您的帮助:)

5 个答案:

答案 0 :(得分:270)

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

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

答案 1 :(得分:6)

现在,JavaScript已经落后了(自ES2018起),在较新的环境中,您可以完全避免在此类情况下进行分组。相反,回头看看要捕获的组之前发生的事情,然后向前寻找,然后用 just !NEW_ID!代替:

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

使用此方法,完全匹配项仅是 需要替换的部分。

  • (?<=name="\w+)-name"的后向搜索,后跟文字字符(幸运的是,在Java语言中,后向导航不必固定宽度!)
  • \d+-匹配一个或多个数字-模式的唯一部分不在环视范围内,字符串的唯一部分将出现在结果匹配项中
  • (?=\w+")-向前搜索单词字符,后跟" `

请记住,后面的内容很新。它可以在V8的现代版本(包括Chrome,Opera和Node)中运行,但至少not in most other environments尚不能使用。因此,尽管您可以在Node和自己的浏览器中可靠地使用lookbehind(如果在现代版本的V8上运行),但是随机客户端(例如在公共网站上)仍未提供足够的支持。

答案 2 :(得分:1)

对马修的回答略有改进可能是一个先行而不是最后一个捕获组:

.replace(/(\w+)(\d+)(?=\w+)/, "$1!NEW_ID!");

或者您可以拆分小数并加入您的新ID,如下所示:

.split(/\d+/).join("!NEW_ID!");

示例/基准:https://codepen.io/jogai/full/oyNXBX

答案 3 :(得分:0)

一个更简单的选择是捕获数字并替换它们。

client.pfx

资源

答案 4 :(得分:0)

使用两个捕获组也是可以的;我还要在数字前后加上两个破折号,作为附加的左右边界,修改后的表达式应该像这样:

(.*name=".+_)\d+(_[^"]+".*)

const regex = /(.*name=".+_)\d+(_[^"]+".*)/g;
const str = `some_data_before name="some_text_0_some_text" and then some_data after`;
const subst = `$1!NEW_ID!$2`;
const result = str.replace(regex, subst);
console.log(result);


  

如果您想探索/简化/修改表达式,可以   在右上角的面板上进行了说明   regex101.com。如果您愿意,   也可以在this link中观看它的匹配方式   针对一些样本输入。


RegEx电路

jex.im可视化正则表达式:

enter image description here