是否有以下功能:
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,一些实现可能会效率很高,其中多次复制长字符串。
答案 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"