JavaScript在特定索引后找到第一个RegExp匹配

vmpqdwk3  于 2022-12-14  发布在  Java
关注(0)|答案(2)|浏览(154)

我想在JavaScript中的 String 中查找某个 index 之后的第一个 RegExp 匹配项。
JavaScript String.prototype.indexOf提供了第二个参数限制,从哪里开始搜索。但是indexOf只支持String,不支持RegExpString.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 为(?=(...))并调整捕获组时,以上代码才有效。

4ktjp1zp

4ktjp1zp1#

我问了same question,找到了一个答案,我将在这里分享。

function matchFrom(str, reg, fromIndex) {
    if (!reg.sticky) throw new Error("RegExp requires sticky (y) opyion.")
    reg.lastIndex = fromIndex
    return reg.exec(str)
}
h43kikqp

h43kikqp2#

把我的评论变成答案...
你的解答看起来是正确的,我不知道有什么更快的解答能给出你的问题的参数
但是,我认为,与其直接回答这个问题,我会问为什么你需要这个函数?

for (let index = 0;; ++index) {
  const match = matchFrom(str, reg, index);
  if (!match) {
    break;
  }
  doSomethingWithMatch(match);
}

我觉得最好重写一下

const matches = str.matchAll(reg);
for (const match in matches) {
  doSomethingWithMatch(match);
}

我的观点是,matchFrom速度慢的事实表明,也许它不是一个好的函数,首先,重构试图使用它的代码是一个更好的地方。

相关问题