JavaScript RegExp 正则表达式定义、属性与方法详解

作者:拾光时间:2026-10-23 04:07:38浏览:169

本文详细解析 JavaScript 中 RegExp 引用类型的核心用法,涵盖字面量与构造函数两种定义方式及元字符转义规则。深入讲解 global、ignoreCase 等实例属性,并对比分析 match、exec、test 等方法在设置 g 标志时的行为差异,特别是 lastIndex 对匹配结果的影响及常见错误处理方案。

RegExp 定义与属性

本文详细介绍 JavaScript 中 RegExp 引用类型的基础用法,旨在为开发者提供清晰的参考。

1、正则表达式的定义方式

正则表达式支持三个修饰符:全局匹配标志 g、忽略大小写标志 i 以及多行匹配标志 m。

1) 使用字面量方式定义


var pattern = /[fe]at/gim;

2) 使用构造函数方式定义:

构造函数接收两个参数:第一个是表示匹配模式的字符串,第二个是可选的模式修饰符字符串(包含 g、i、m)。


var pattern = new RegExp("[fe]at","gim");

需要注意以下事项:

1) 若匹配字符串中包含特殊元字符,必须对其进行转义,这些字符包括:( [ { \ ^ & | ) ? * + . ] } 。

2) 由于构造函数定义正则表达式时,其参数是字符串,因此涉及双重转义的情况。例如,字符 \ 在普通字符串中通常转义为 \\,而在正则表达式的字符串参数中,它需要写成 \\\\。以字面量模式 /\w\\hello\\123/ 为例,其等价的字符串参数为“\\w\\\\hello\\\\123”。

2、RegExp 实例属性

  • 1) global:布尔值,表示是否设置了 g 标志。
  • 2) ignoreCase:布尔值,表示是否设置了 i 标志。
  • 3) multiline:布尔值,表示是否设置了 m 标志。
  • 4) lastIndex:整数,记录上一次匹配结束的位置,即下一次搜索下一个匹配项的起始位置,索引从 0 开始。
  • 5) source:字符串,返回正则表达式的字符串表示形式,始终按照字面量模式返回,而非构造函数传入的原始字符串。

var pattern = new RegExp("\\[fe\\]at","i");
alert(pattern.source);

上述代码执行后,alert 输出结果为 \[fe\]at。

RegExp 实例方法详解

3、RegExp 实例方法

1) 继承自 Object 的 toLocaleString()、toString()、valueOf() 方法

toLocaleString():返回正则表达式的字面量形式,无论创建方式如何。

toString():返回正则表达式的字面量形式,无论创建方式如何。

valueOf():返回正则表达式对象本身。


var pattern1 = /\[fe\]at/i);
var pattern2 = new RegExp("\\[fe\\]at","i");
alert(pattern1.toString()); // /\[fe\]at/i
alert(pattern1.toLocaleString()); // /\[fe\]at/i
alert(pattern2.toString()); // /\[fe\]at/i
alert(pattern2.toLocaleString()); // /\[fe\]at/i

2) match() 方法

参数:用于匹配的正则表达式对象。

返回值:match() 的返回值类型主要取决于是否设置了 g 标志。若未设置 g 标志,其行为与 exec() 等价。

a. 如果设置了 g 标志,该方法返回包含所有匹配项的数组。

b. 如果没有设置 g 标志,该方法返回包含第一个匹配项信息的数组。其中,第 0 项是与整个正则表达式匹配的字符串,第 1 项是与第 1 个子表达式匹配的文本(如果存在),第 2 项是与第 2 个子表达式匹配的文本(如果存在)。

3) exec() 方法

参数:要应用正则表达式模式的字符串。

返回值:返回包含第一个匹配项信息的数组,没有匹配项的情况下返回null。exec()的返回值不受g标志影响,在不设置g标志时,在同一个字符串上多次调用exec()将会始终返回第一个匹配项的信息。即使设置了g标志,一次也只返回一个匹配项,但设置g标志时,每次调用exec()都会在字符串中继续查找新匹配项,会驱动lastIndex可以模拟遍历所有匹配,可以与match()设置g标志时等价(区别在于遍历所有匹配时,exec()需要多次匹配,match()一次匹配即可得到所有匹配)。

返回的数组包含两个额外属性:index 和 input。其中,index 表示匹配项在字符串中的起始位置,input 表示应用正则表达式的原始字符串。数组中,第 0 项是与整个正则表达式匹配的字符串,第 1 项是与第 1 个子表达式匹配的文本(如果存在),第 2 项是与第 2 个子表达式匹配的文本(如果存在)。


var str = "Shanghai and Beijing and Guangzhou";
var pattern = /Shanghai ( and Beijing ( and Guangzhou)?)?/gi;
var match = pattern.exec(str);
alert(match.index);//0
alert(match.input);//"Shanghai and Beijing and Guangzhou"
alert(match[0]);//"Shanghai and Beijing and Guangzhou"
alert(match[1]);//"and Beijing and Guangzhou"
alert(match[2]);//"and Guangzhou"

在未设置 g 标志的情况下,对同一字符串调用 exec(),始终返回第一个匹配项的信息。


var str = "fat eat";
var pattern = /.at/;
var match = pattern.exec(str);
alert(match.index);//0
alert(match.input);//fat eat
alert(match[0]);//fat
alert(pattern.lastIndex);//0
var match = pattern.exec(str);
alert(match.index);//0
alert(match.input);//fat eat
alert(match[0]);//fat
alert(pattern.lastIndex);//0

在设置全局标志 g 的情况下,对同一字符串调用 exec(),每次会返回一个新的匹配项信息。


var str = "fat eat";
var pattern = /.at/g;
var match = pattern.exec(str);
alert(match.index);//0
alert(match.input);//fat eat
alert(match[0]);//fat
alert(pattern.lastIndex);//3
var match = pattern.exec(str);
alert(match.index);//4
alert(match.input);//fat eat
alert(match[0]);//eat
alert(pattern.lastIndex);//7

4) test() 方法

参数:要应用模式的字符串。

返回值:如果模式与参数匹配,返回 true;否则返回 false。

test() 方法常用于 if 语句中进行条件判断。

常见问题:

如果正则表达式带有 g 标志,使用 test 校验不同字符串时,RegExp 会利用 test 前一个字符串得出的 lastIndex 去校验后一个字符串,这必然导致错误。


var pattern = /^[1-9]\d{4,10}$/gi;
var str = "88888";
alert(pattern.test(str));//返回true
str = "888888";
alert(pattern.test(str));//返回false

解决方法:

① 在再次用作校验前,将正则表达式的 lastIndex 属性手动设置为 0。


var pattern = /^[1-9]\d{4,10}$/gi;
var str = "88888";
alert(pattern.test(str));//返回true
str = "888888";
pattern.lastIndex=0;
alert(pattern.test(str));//返回true

② 正则表达式定义时去掉 g 标志。


var pattern = /^[1-9]\d{4,10}$/i;
var str = "88888";
alert(pattern.test(str));//返回true
str = "888888";
alert(pattern.test(str));//返回true

5) 补充说明:

① exec() 和 test() 是正则表达式对象的方法,其参数是字符串;而 match 是字符串对象的方法,其参数是正则表达式对象。

② 即使设置了 g 标志,exec() 每次也只返回一个匹配项。未设置 g 标志时,exec() 和 match() 执行结果相同;设置 g 标志时,match() 将忽略子表达式,仅查找全匹配的正则表达式。

③ exec() 和 match() 的区别如下:

a. 当正则表达式无子表达式且未设置 g 标志时,exec() 和 match() 执行结果相同,均返回第一个匹配的字符串内容。


var pattern = new RegExp("cat") ;
var str = "onecat twocat";
alert(pattern.exec(str));//返回cat
alert(str.match(pattern));//返回cat

b. 当正则表达式无子表达式且设置 g 标志时,exec() 返回第一个匹配的字符串内容;若存在多处匹配,match() 返回包含所有匹配字符串的数组。


var pattern = new RegExp("cat","g") ;
var str = "onecat twocat";
alert(pattern.exec(str));//返回cat
alert(str.match(pattern));//返回cat,cat

c. 当正则表达式有子表达式且未设置 g 标志时,exec() 和 match() 执行结果相同,均查找全匹配正则表达式及子表达式,并返回包含全匹配字符串和匹配子表达式的数组。


var pattern = new RegExp("c(at)") ;
var str = "onecat twocat";
alert(pattern.exec(str));//返回cat,at
alert(str.match(pattern));//返回cat,at

d. 当正则表达式有子表达式且设置 g 标志时,exec() 和 match() 执行结果不同:match() 将忽略子表达式,仅查找全匹配的正则表达式,并返回包含所有匹配字符串的数组。


var pattern = new RegExp("c(at)","g") ;
var str = "onecat twocat";
alert(pattern.exec(str));//返回cat,at
alert(str.match(pattern));//返回cat,cat

三个标志:全局模式 g,不区分大小写模式 i,多行模式 m。

PS:这里再为大家提供 2 款非常方便的正则表达式工具供大家参考使用:

JavaScript 正则表达式在线测试工具: http://tools.jb51.net/regex/javascript

正则表达式在线生成工具: http://tools.jb51.net/regex/create_reg

更多关于 JavaScript 相关内容感兴趣的读者可查看本站专题:《JavaScript 正则表达式技巧大全》、《JavaScript 替换操作技巧总结》、《JavaScript 查找算法技巧总结》、《JavaScript 数据结构与算法技巧总结》、《JavaScript 遍历算法与技巧总结》、《JavaScript 中 json 操作技巧总结》、《JavaScript 错误与调试技巧总结》及《JavaScript 数学运算用法总结》

希望本文所述对大家 JavaScript 程序设计有所帮助。

作者最新文章