是否有任何Javascript函数与指定索引中的正则表达式不匹配

是否有任何Javascript函数与指定索引中的正则表达式不匹配,javascript,regex,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=reg

是否有以下功能:

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,则某些实现可能会以很低的效率工作,即多次复制长字符串

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

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"

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

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"
是的,如果正则表达式具有g全局修饰符,则可以使exec从特定索引开始

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);
}
或者作为一段时间

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

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);
}
或者作为一段时间


您可以将{3}放在正则表达式的开头。我想您知道,在这种情况下,您只需启动\w+,然后遍历每个单独的匹配项?我猜这是对实际场景的一种简化,不过……对代码进行分析怎么样?或者看看JavaScript虚拟机的实现?JavaScript中的字符串是不可变的,因此一个好的实现将共享字符的空间,而不是复制字符。所以,是的,子字符串生成一个新对象,但不一定复制字符数据。你的绳子的长度很可能无关紧要。无论如何,为了确保你在这里没有X-Y问题,考虑使用G标志,因为你可能试图反复寻找单词,对吗?你可以在正则表达式的开头放{ 3 }。我想你知道,在这种情况下,你可以开火W+,然后步行每个单独的匹配。我猜这是对实际场景的一种简化,不过……对代码进行分析怎么样?或者看看JavaScript虚拟机的实现?JavaScript中的字符串是不可变的,因此一个好的实现将共享字符的空间,而不是复制字符。所以,是的,子字符串生成一个新对象,但不一定复制字符数据。你的绳子的长度很可能无关紧要。无论如何,为了确保你在这里没有X-Y问题,考虑使用G标志,因为你很可能一次又一次地试图找到单词,对吗?+ 1是一个很有用的答案,提醒人们G,这可能是OP想要做的事情。谢谢这就是我想做的@不客气。我只是稍微改变了一下措辞,因为我觉得我一开始误解了。如果最终需要字符串中的所有匹配项,则无需手动设置.lastIndex。你会喜欢你的第一个例子,但包括g。也可以在循环中运行exec。我将更新一个循环示例。@hoge1e3如果您有一个字符串,其中包含用空格分隔的单词,并且您希望得到一个包含所有不带空格的单词的数组,您可以使用一个带有单词分隔的字符串。split/\s+/+1一个非常有用的答案,提醒人们g,这可能是OP想要做的事情谢谢这就是我想做的@不客气。我只是稍微改变了一下措辞,因为我觉得我一开始误解了。如果最终需要字符串中的所有匹配项,则无需手动设置.lastIndex。你会喜欢你的第一个例子,但包括g。也可以在循环中运行exec。我将更新一个循环示例。@hoge1e3如果您有一个字符串,其中包含用空格分隔的单词,并且您希望得到一个包含所有不带空格的单词的数组,您可以使用一个带有单词分隔的字符串。split/\s+/;