为了账号安全,请及时绑定邮箱和手机立即绑定

如何使用 .exec() 访问/替换全局匹配正则表达式中的捕获组?

如何使用 .exec() 访问/替换全局匹配正则表达式中的捕获组?

森林海 2022-10-27 16:45:43
我正在尝试访问所有捕获组以进行替换,在这种情况下,我们将所需的结果用括号括起来:(有关所需结果,请参阅评论)const text = 'nonsense nonsense relevant nonsense nonsense relevant nonsense nonsense';const matcher = /(.*)(relevant)(.*)/gi // Not sure of my regex, since I can't figure out how to actually test itlet desiredResult; // 'nonsense nonsense (relevant) nonsense nonsense (relevant) nonsense nonsense'我见过while循环方法,但它总是只关注 中的一个捕获组matcher,所以我无法从这些示例中收集我需要理解的内容这个问题可能有重复,但我花了一个多小时搜索并没有找到它。许多人显然都问同样的问题,但似乎所有人都忽略了多个捕获组方面。我对如何执行此操作的其他建议持开放态度,尽管我的用例可能会变得更加复杂,涉及额外的捕获组和操作,所以我认为这是最好的方法。我知道,matchAll但我也看不出它如何解决我的问题。我想要对索引、匹配项和整个 shebang 的低级别访问。
查看完整描述

1 回答

?
慕丝7291255

TA贡献1859条经验 获得超6个赞

是否有某些原因您不能使用或不想使用String.prototype.replace?这正是它的意图:匹配和替换。exec只查找匹配项,不替换。

*编辑:既然你说你想要低级访问,我正在改变我的例子来展示如何使用回调函数,并做一些花哨的东西,比如获取匹配的索引并将其添加到方括号中括号。我还在匹配的单词之前和之后添加了空白捕获,以显示在此方法中如何处理多个捕获组。

const text = 'nonsense nonsense relevant nonsense nonsense relevant nonsense nonsense';

const matcher = /(\s+)(relevant)(\s+)/gi;


function cb(match, p1, p2, p3, i, fullTxt) {

  return p1 + '(' + p2 + ')['+i+']' + p3;

}

let desiredResult = text.replace(matcher, cb);

console.log(desiredResult);


查看完整回答
反对 回复 2022-10-27
  • 1 回答
  • 0 关注
  • 64 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信