我想在JavaScript中的 String 中查找某个 index 之后的第一个 RegExp 匹配项。
JavaScript String.prototype.indexOf
提供了第二个参数限制,从哪里开始搜索。但是indexOf
只支持String
,不支持RegExp
。String.prototype.match
确实使用RegExp
。但是它不支持从某个索引开始搜索的另一个参数。
谢天谢地,JavaScript提供了String.prototype.matchAll
来给予所有匹配。(这也可以通过RegExp.prototype.exec
来完成。)目前,我可以这样做:
/**
* @param {string} str
* @param {RegExp} reg
* @param {number} fromIndex
*/
function matchFrom(str, reg, fromIndex) {
for (const match of str.matchAll(reg)) {
if (match.index >= fromIndex) return match;
}
return null;
}
上面的代码和我预期的一样。但是它从一开始就迭代。对于一个更大的str
。它可能会很慢(据我的理解,没有测试)。我想知道是否有更好的方法来实现这一点。
*注意:字符串切片在一般情况下可能没有帮助,因为RegExp可能包含lookbehindAssert。(尽管性能也值得怀疑。)
*注意2:只有当我将reg
Package 为(?=(...))
并调整捕获组时,以上代码才有效。
2条答案
按热度按时间4ktjp1zp1#
我问了same question,找到了一个答案,我将在这里分享。
h43kikqp2#
把我的评论变成答案...
你的解答看起来是正确的,我不知道有什么更快的解答能给出你的问题的参数
但是,我认为,与其直接回答这个问题,我会问为什么你需要这个函数?
我觉得最好重写一下
我的观点是,
matchFrom
速度慢的事实表明,也许它不是一个好的函数,首先,重构试图使用它的代码是一个更好的地方。