JavaScript正则expression式:连续匹配
我正在用JavaScript编写一个词法扫描器。 有一个inputStr
和正则[ regexp1, regexp2, ... ]
的列表[ regexp1, regexp2, ... ]
,我需要连续匹配inputStr
和regexps列表。 假设regexps[i]
匹配inputStr
的前5个字符,我将继续从第6个字符开始进行匹配。
我检查了JavaScript的RegExp API,我没有看到任何方式来控制匹配指定索引的string。 RegExp对象的lastIndex
属性在这种情况下不起作用,因为如果lastIndex
的字符不匹配,它将尝试从下一个字符匹配,但是我希望立即停止。
我认为你是对的,没有任何内置的东西可以帮助你做到这一点。
三个选项:
-
显而易见的事情:在正则expression式中使用
^
(所以它们只在input的开头匹配),并在继续之前从string中删除以前匹配的字符(例如,在你的例子中的前五个)。 -
使用dynamic生成的前缀创build新的正则expression式,例如
^.{5}
(例如,跳过前五个字符),但是我认为这会比分割string更昂贵。 当然,您可以根据需要创build正则expression式,但保留并重用它们; 当然有内存的影响。 -
继续使用
lastIndex
但忽略匹配,除非它位于您想要的索引处。 这是浪费(正则expression式引擎寻找一个匹配,你可能会忽略),我不喜欢它,但我想不妨,列出它。
我可能会从选项1(简单选项)开始,只考虑替代scheme,如果我确定它是创build一个性能或内存stream失的问题。 但是JavaScript引擎创build并清理了很多临时string,我认为V8在pipe理它们方面非常好。