1

是否有以下功能:

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 被多次调用,某些实现可能会在多次复制长字符串时效率低下。

4

2 回答 2

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);
于 2012-09-10T15:01:36.907 回答
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"
于 2012-09-10T14:57:26.383 回答