regex.exec(str) 有效,但 str.matchAll(regex) 不起作用



我正试图使用正则表达式来捕获查询字符串中的所有标记,如下所示(在本例中为horrorcomedy(。标签可能多于或少于两个;这只是一个例子。

const queryString = "?q=user:bob tag:horror tag:comedy"
const grabTagsRegex = new RegExp(/.* tag:(.+)( |$)/g)

我可以得到这样的第一个匹配组:

const result = grabTagsRegex.exec(queryString)
// result[1] gives me "horror"

但我想捕获所有的标签,所以我考虑像这样使用matchAll,但它返回了一个空的RegExpStringIterator。

queryString.matchAll(grabTagsRegex)

我想知道如何获得所有的标签,这样我就可以对它们进行迭代。我已经看了很多像这样的线程,但无法使其工作。我怀疑我的正则表达式不正确,但我不确定。

感谢您提前提供的帮助。

您的模式是错误的,因为.* tag:(.+)( |$)匹配" tag:"子字符串的最后一个出现,并捕获当前位置右侧除换行字符之外的任何一个或多个字符,这意味着这里的字符串结束。

你可以使用

queryString.matchAll(/btag:(S+)/g)

这里,btag:(S+)tag作为一个完整单词与右边的:进行匹配,然后将任何一个或多个非空白字符捕获到组1中。

请参阅regex演示和JavaScript演示:

const queryString = "?q=user:bob tag:horror tag:comedy";
const matches = queryString.matchAll(/btag:(S+)/g);
console.log(Array.from(matches, x => x[1]));

最新更新