好的问题很简单。 我正在寻找像这样的字符串:
name="some_text_0_some_text"
我在上面的字符串之前和之后都有HTML代码。
现在我想用以下内容替换0:!NEW_ID!
所以我做了一个简单的正则表达式:
.*name="\w+(\d+)\w+".*
但是我没有看到如何专门替换捕获的块。
有没有办法用其他字符串替换像($ 1)这样的捕获结果?
结果将是:
name="some_text_!NEW_ID!_some_text"
感谢您的帮助:)
答案 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!");
答案 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中观看它的匹配方式 针对一些样本输入。
jex.im可视化正则表达式: