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

我正在尝试访问所有捕获组以进行替换,在这种情况下,我们将所需的结果用括号括起来:


(有关所需结果,请参阅评论)



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 it


let desiredResult; // 'nonsense nonsense (relevant) nonsense nonsense (relevant) nonsense nonsense'


我见过while循环方法,但它总是只关注 中的一个捕获组matcher,所以我无法从这些示例中收集我需要理解的内容


这个问题可能有重复,但我花了一个多小时搜索并没有找到它。许多人显然都问同样的问题,但似乎所有人都忽略了多个捕获组方面。


我对如何执行此操作的其他建议持开放态度,尽管我的用例可能会变得更加复杂,涉及额外的捕获组和操作,所以我认为这是最好的方法。我知道,matchAll但我也看不出它如何解决我的问题。我想要对索引、匹配项和整个 shebang 的低级别访问。


森林海
浏览 105回答 1
1回答

慕丝7291255

是否有某些原因您不能使用或不想使用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);
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

JavaScript