JavaScript正则expression式:连续匹配

我正在用JavaScript编写一个词法扫描器。 有一个inputStr和正则[ regexp1, regexp2, ... ]的列表[ regexp1, regexp2, ... ] ,我需要连续匹配inputStr和regexps列表。 假设regexps[i]匹配inputStr的前5个字符,我将继续从第6个字符开始进行匹配。

我检查了JavaScript的RegExp API,我没有看到任何方式来控制匹配指定索引的string。 RegExp对象的lastIndex属性在这种情况下不起作用,因为如果lastIndex的字符不匹配,它将尝试从下一个字符匹配,但是我希望立即停止。

我认为你是对的,没有任何内置的东西可以帮助你做到这一点。

三个选项:

  1. 显而易见的事情:在正则expression式中使用^ (所以它们只在input的开头匹配),并在继续之前从string中删除以前匹配的字符(例如,在你的例子中的前五个)。

  2. 使用dynamic生成的前缀创build新的正则expression式,例如^.{5} (例如,跳过前五个字符),但是我认为这会比分割string更昂贵。 当然,您可以根据需要创build正则expression式,但保留并重用它们; 当然有内存的影响。

  3. 继续使用lastIndex但忽略匹配,除非它位于您想要的索引处。 这是浪费(正则expression式引擎寻找一个匹配,你可能会忽略),我不喜欢它,但我想不妨,列出它。

我可能会从选项1(简单选项)开始,只考虑替代scheme,如果我确定它是创build一个性能或内存stream失的问题。 但是JavaScript引擎创build并清理了很多临时string,我认为V8在pipe理它们方面非常好。