正则表达式测试函数不返回相同的引号

Regex test function do not return the same depending quotes

本文关键字:返回 测试 函数 正则表达式      更新时间:2023-09-26

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

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

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

谢谢你的帮助。

朱利安

当在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');将具有相同的行为。

如果您希望regex重新开始,您可以从regex中删除全局标志,或者在每次尝试找到匹配后将re.lastIndex设置为0,例如:

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

Blender在注释中注意到的交替可以解释,因为当匹配失败时,lastIndex被自动设置为0,因此失败后的下一次尝试将成功。