如何仅替换捕获的组?

2020/10/16 00:41 · javascript ·  · 0评论

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

name="some_text_0_some_text"

我想将替换为0!NEW_ID!

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

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

但我看不到如何专门替换捕获的块。

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

结果将是:

name="some_text_!NEW_ID!_some_text"

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

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

既然Java语言已经落后了(从ES2018开始),在较新的环境中,您可以完全避免在此类情况下进行分组。相反,回头看看要捕获的组之前发生的事情,并回首发生的事情,然后用just 代替!NEW_ID!

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

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

  • (?<=name="\w+)-Lookbehind for name=",后跟单词字符(幸运的是,lookbehinds在Javascript中不必固定宽度!)
  • \d+ -匹配一位或多位数字-模式的唯一部分不在环视范围内,字符串的唯一部分将出现在结果匹配项中
  • (?=\w+")-前瞻字词,后跟"
    `

请记住,向后看是很新的。它可以在V8的现代版本(包括Chrome,Opera和Node)中使用,但在大多数其他环境中(至少目前还不能)使用。因此,尽管您可以在Node和自己的浏览器中可靠地使用lookbehind(如果在现代版本的V8上运行),但是随机客户端(例如在公共网站上)尚不能充分支持它。

对Matthew答案的一点改进可能是先行,而不是最后一个捕获组:

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

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

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

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

如果有两个捕获组,也将是可能的;我还要在数字前后加上两个破折号,作为附加的左右边界,并且修改后的表达式将如下所示:

(.*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的右上方面板中进行
说明如果您愿意,您还可以在
此链接中观看,它如何与一些示例输入匹配。


RegEx电路

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

在此处输入图片说明

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

const name = 'preceding_text_0_following_text';
const matcher = /(\d+)/;

// Replace with whatever you would like
const newName = name.replace(matcher, 'NEW_STUFF');
console.log("Full replace", newName);

// Perform work on the match and replace using a function
// In this case increment it using an arrow function
const incrementedName = name.replace(matcher, (match) => ++match);
console.log("Increment", incrementedName);

资源资源

本文地址:http://javascript.askforanswer.com/ruhejintihuanbuhuodezu.html
文章标签: ,  
版权声明:本文为原创文章,版权归 javascript 所有,欢迎分享本文,转载请保留出处!

文件下载

老薛主机终身7折优惠码boke112

上一篇:
下一篇:

评论已关闭!