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

问题描述 投票:0回答:1

我想在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。可能会很慢(据我了解,未经测试)。我想知道是否有更好的方法来实现这一目标。


  • Note:在一般情况下,字符串切片可能无济于事,因为RegExp可能包含后向断言。 (尽管性能也令人怀疑。)
  • 2:仅当我用reg包裹(?=(...))并调整捕获组时,以上代码才有效。
javascript regex string
1个回答
0
投票

将我的评论放入答案...

我想而不是直接回答问题,我想问你为什么需要这个功能?我们无法看到您的代码,但例如,我们说有

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很慢,这表明它可能不是一开始就不好的功能,而重构试图使用它的代码是花费更多精力的好地方。

© www.soinside.com 2019 - 2024. All rights reserved.