是否有任何Javascript函数从指定的索引进行正则表达式匹配

时间:2012-09-10 14:49:42

标签: javascript regex

是否有以下功能:

var regex=/\s*(\w+)/;
var s="abc def ";
var m1=regex.exec(s,0); // -> matches "abc"
var m2=regex.exec(s,3); // -> matches "def"

我知道替代方案是:

var regex=/\s*(\w+)/;
var s="abc def ";
var m1=regex.exec(s); // -> matches "abc"
var m2=regex.exec(s.substring(3)); // -> matches " def"

但是我担心如果s很长并且多次调用s.substring,一些实现可能会效率很高,其中多次复制长字符串。

2 个答案:

答案 0 :(得分:4)

是的,如果正则表达式具有exec全局修饰符,则可以使g从特定索引处开始。

var regex=/\s*(\w+)/g; // give it the "g" modifier

regex.lastIndex = 3;   // set the .lastIndex property to the starting index

var s="abc def ";

var m2=regex.exec(s); // -> matches "def"

如果您的第一个代码示例具有g修饰符,那么它将在您编写时起作用,原因与上述相同。使用g时,它会自动将.lastIndex设置为超过最后一个匹配结束的索引,因此下一个调用将从那里开始。

所以这取决于你需要什么。

如果您不知道会有多少匹配,常见的方法是在循环中运行exec

var match,
    regex = /\s*(\w+)/g,
    s = "abc def ";

while(match = regex.exec(s)) {
    alert(match);
}

do-while

var match,
    regex = /\s*(\w+)/g,
    s = "abc def ";

do {
    match = regex.exec(s);
    if (match)
        alert(match);
} while(match);

答案 1 :(得分:0)

我认为没有任何正则表达式方法可以做到这一点。如果您担心性能,我只会存储完整的字符串和剪切的字符串,因此substring只被调用一次:

var regex=/\s*(\w+)/;
var s="abc def ";
var shorts = s.substring(3);
var m1=regex.exec(s); // -> matches "abc"
var m2=regex.exec(shorts); // -> matches " def"