6

我在 javascript 中使用正则表达式有一个奇怪的情况:

var re = /[^\s]+(?:\s+|$)/g;
re.test('foo'); // return true
re.test("foo"); // return false

正则表达式类型是否敏感?我的第一个目标是提取字符串的所有单词(由一个或多个空格分隔)。

谢谢你的帮助。

朱利安

4

1 回答 1

10

在 Javascript 正则表达式上使用g标志时,它将跟踪找到最后一个匹配项的位置,并在您下次尝试查找匹配项时从该索引开始搜索。

在这两个re.test()电话之间,看看re.lastIndex我在说什么。

例如:

var re = /[^\s]+(?:\s+|$)/g;
re.test('foo'); // return true
re.lastIndex;   // 3
re.test("foo"); // return false

您会注意到您使用的引号类型无关紧要,re.test('foo'); re.test('foo');将具有相同的行为。

如果您希望正则表达式重新开始,您可以从您的正则表达式中删除全局标志,或者在每次尝试查找匹配项后设置re.lastIndex为,例如:0

var re = /[^\s]+(?:\s+|$)/g;
re.test('foo'); // return true
re.lastIndex = 0;
re.test("foo"); // return true

Blender在评论中注明的交替可以解释,因为匹配失败时lastIndex自动设置0,所以失败后的下一次尝试会成功。

于 2013-04-18T19:35:38.643 回答