JavaScript正则表达式lastIndex属性详解

作者:木棉

时间:2026-10-22

浏览:67

本文深入解析JavaScript中RegExp对象的五个属性,重点剖析带有g修饰符时lastIndex属性的工作机制。通过对比exec和test方法的行为,说明lastIndex如何影响后续匹配位置及结果,并给出重置该属性的实用技巧。

文章目录

RegExp对象属性概览

说明

本文主要探讨JavaScript中RegExp对象的相关属性。

解释

每个RegExp对象均包含五个属性:source、global、ignoreCase、multiline以及lastIndex。

source属性是一个只读字符串,用于保存正则表达式的文本内容。


var reg = /JavaScript/;
reg.source; //返回 JavaScript

global属性是一个只读布尔值,指示正则表达式是否包含g修饰符。

g修饰符代表全局匹配,即检索字符串中所有符合模式的匹配项。


var str = "JavaScript";
str.match(/JavaScript/); //只能匹配一个JavaScript 
var str = "JavaScript JavaScript";
str.match(/JavaScript/g); //能匹配两个JavaScript 
var reg = /JavaScript/;
reg.global; //返回 false
var reg = /JavaScript/g;
reg.global; //返回 true

ignoreCase属性是一个只读布尔值,指示正则表达式是否包含i修饰符。

i修饰符表示模式匹配时不区分大小写。


var reg = /JavaScript/;
reg.ignoreCase; //返回 false
var reg = /JavaScript/i;
reg.ignoreCase; //返回 true
var reg = /JavaScript/;
reg.test("javascript"); //返回 false
var reg = /JavaScript/i;
reg.test("javascript"); //返回 true

multiline属性是一个只读布尔值,指示正则表达式是否包含m修饰符。

m修饰符用于启用多行匹配模式,需配合^和$符号使用。使用^和$时,除了匹配整个字符串的开头和结尾,还能匹配每一行的开头和结尾。


var str="java\nJavaScript";
str.match(/^JavaScript/); //返回null
var str="java\nJavaScript";
str.match(/^JavaScript/m); //匹配到一个JavaScript
var reg=/JavaScript/;
reg.multiline; //返回false
var reg=/JavaScript/m;
reg.multiline; //返回true

lastIndex属性机制解析

lastIndex属性是一个可读写的整数。若匹配模式中包含g修饰符,该属性存储了在下一次检索时开始搜索的位置,此属性会被exec()和test()方法所引用。

exec()方法用于在字符串中执行匹配检索。若未找到任何匹配,则返回null;若找到匹配,则返回一个数组。

当调用exec()的正则表达式对象带有g修饰符时,它会将当前正则表达式对象的lastIndex属性设置为紧邻匹配子串的下一个字符位置。若对同一正则表达式再次调用exec(),它将从lastIndex属性指示的位置开始检索。如果exec()未找到任何匹配结果,它会将lastIndex重置为0。

RegExp对象属性概览

test()方法的参数是一个字符串。使用test()检测字符串时,若包含正则表达式的匹配结果,则返回true,否则返回false。


var str="java";
var reg=/JavaScript/;
reg.test(str); //返回false
var str="JavaScript";
var reg=/JavaScript/;
reg.test(str); //返回true

当调用test()的正则表达式对象带有g修饰符时,其行为与exec()相同。它从lastIndex指定的位置开始检索字符串,若找到匹配结果,则立即将lastIndex设置为紧邻匹配子串的下一个字符位置。

代码示例与行为验证

观察以下示例代码


var str="JavaScript";
var reg=/JavaScript/g;
console.log(reg.test(str)); //打印 true
console.log(reg.test(str)); //打印 false

为何相同的字符串和正则表达式,打印结果却不同?若已理解lastIndex属性,便能明白原因。

具体分析如下


var str="JavaScript";
var reg=/JavaScript/g;
console.log(reg.test(str)); //打印 true
console.log(reg.lastIndex);
//打印10,因为匹配到了JavaScript,所以设置lastIndex为匹配结果紧挨着的字符位置
console.log(reg.test(str));
//打印 false,因为从lastIndex位置检索字符串,已经没有匹配结果了
console.log(reg.lastIndex);
//打印0,因为没有匹配到结果,所以将lastIndex重置为0

需注意,若在第一次调用test()匹配结束后,手动将lastIndex重置为0,则第二次调用test()同样可以打印true。


var str="java JavaScript java";
var reg=/JavaScript/g;
console.log(reg.test(str)); //打印 true
reg.lastIndex=0;
console.log(reg.test(str)); //打印 true

再次强调,上述关于lastIndex的问题,均源于正则表达式对象中带有g修饰符。若不带g修饰符,则无需担心此类问题。

总结

本文主要介绍JavaScript中正则表达式对象的五个属性,其中最需要关注的是lastIndex属性。

实用工具推荐

电子包浆

绿化、压缩、噪点和虚拟水印,自由调节做旧程度。

使用 ›
图片压缩

选择画质和输出格式,预览压缩前后的大小。

使用 ›
相关文章