JavaScript 正则表达式定义、语法与常用方法详解

作者:半夏

时间:2026-10-28

浏览:185

本文系统介绍 JavaScript 中正则表达式的两种定义方式及核心语法,包括字符类、锚点和修饰符。详细解析 String 对象的 search、replace、match、split 方法在正则匹配中的应用,并深入讲解 RegExp 对象的 exec 与 test 方法的执行逻辑及 lastIndex 属性的作用。

文章目录

正则表达式的定义与语法

一、定义正则表达式的方法

在 JavaScript 中,创建正则表达式主要有两种方式:一是使用构造函数,二是使用字面量直接量。具体示例如下:

代码如下:

var reg1 = new RegExp('\d{5, 11}'); // 通过构造函数定义
var reg2 = /\d{5, 12}/; // 通过直接量定义

正则表达式包含多种特殊字符和语法结构,具体如下: 直接量字符: \o:代表 NUL 字符(即 \u0000) \t:代表制表符(即 \u0009) \n:代表换行符(即 \u000A) \v:代表垂直制表符(即 \u000B) \f:代表换页符(即 \u000C) \r:代表回车符(即 \u000D) \xnn:由十六进制数 nn 指定的拉丁字符,例如 \x0A 等价于 \n \uxxxx:由十六进制数 xxxx 指定的 Unicode 字符,例如 \u0009 等价于 \t \cX:控制字符 ^X,例如 \cJ 等价于换行符 \n 锚字符: ^:匹配字符串开头,在多行模式下匹配每行开头 $:匹配字符串结尾,在多行模式下匹配每行结尾 \b:匹配单词边界,即位于 \w 和 \W 之间,或 \w 与字符串首尾之间的位置(注意:[\b] 匹配的是退格符) \B:匹配非单词边界 (?=p):零宽正向先行断言,要求后续字符与 p 匹配,但不包含在匹配结果中 (?!p):零宽负向先行断言,要求后续字符串不与 p 匹配 字符类: [...]:匹配方括号内的任意字符 [^...]:匹配不在方括号内的任意字符 .:匹配除换行符和其他 Unicode 行终止符外的任意字符 \w:匹配任何 ASCII 字母、数字或下划线,等价于 [a-zA-Z0-9] \W:匹配非 ASCII 字母、数字或下划线的字符,等价于 [^a-zA-Z0-9] \s:匹配任何 Unicode 空白字符 \S:匹配非 Unicode 空白字符(注意 \w 与 \S 不同) \d:匹配任何 ASCII 数字,等价于 [0-9] \D:匹配非 ASCII 数字的字符,等价于 [^0-9] [\b]:特例,匹配退格直接量 重复字符语法: {n, m}:匹配前一项至少 n 次,最多 m 次 {n, }:匹配前一项 n 次或更多次 {n}:精确匹配前一项 n 次 ?:匹配前一项 0 次或 1 次(即可选,等价于 {0, 1}) +:匹配前一项 1 次或多次(等价于 {1, }) *:匹配前一项 0 次或多次(等价于 {0, }) 选择、分组和引用: |:选择符,匹配其左侧或右侧的子表达式 (…):组合项,将多个项合并为一个单元,可通过 *、+、?、| 修饰,并记忆匹配内容供后续引用 (?: …):只组合不记忆,将项合并为单元,但不保存匹配结果供引用 \n:引用第 n 个分组首次匹配的字符。组索引从左到右依左括号计数,(?:) 形式的分组不编码。 修饰符: i:忽略大小写进行匹配 g:全局匹配,查找所有匹配而非仅第一个 m:多行模式,^ 匹配行首和字符串首,$ 匹配行尾和字符串尾

代码如下:

var s = "JavaScript".search(/script/i); // s = 4

 

replace():用于执行检索与替换操作。接收两个参数:第一个是正则表达式,第二个是替换字符串。若正则表达式包含 g 修饰符,则执行全局替换;否则仅替换第一个匹配的子串。若第一个参数非正则表达式,则直接搜索该字符串,不转换为正则表达式。示例如下:

代码如下:

var s = "JavaScript".replace(/java/gi, "Script"); // s = Script Script

 

match():参数为正则表达式(若非则自动转换),返回包含匹配结果的数组。若设置 g 修饰符,则执行全局匹配。示例如下:

代码如下:

var d = '55 ff 33 hh 77 tt'.match(/\d+/g); // d = ["55", "33", "77"]

 

split():将调用该方法的字符串拆分为子串数组,分隔符由 split() 的参数指定,参数也可以是正则表达式。示例如下:

代码如下:

var d = '123,31,453,645'.split(','); // d = ["123", "31", "453", "645"]
var d = '21 , 123, 44, 64, 67, 3'.split(/\s*,\s*/); // d = ["21", "123", "44", "64", "67", "3"]

RegExp 对象属性与方法

二、RegExp 对象 每个 RegExp 对象包含 5 个属性: source:只读字符串,包含正则表达式的文本。 global:只读布尔值,表示是否带有 g 修饰符。 ignoreCase:只读布尔值,表示是否带有 i 修饰符。 multiline:只读布尔值,表示是否带有 m 修饰符。 lastIndex:可读可写整数,若匹配模式含 g 修饰符,此属性存储下一次检索的起始位置。 RegExp 对象提供两个主要方法: exec():参数为字符串,功能与 match() 类似,用于在字符串中执行正则匹配。若无匹配返回 null;若有匹配返回数组,首元素为与正则表达式匹配的字符串,其余元素为圆括号内子表达式的匹配子串。无论是否有 g 修饰符,返回数组结构一致。当正则表达式含 g 修饰符时,exec() 会将 lastIndex 设置为紧接匹配子串的字符位置。再次调用 exec() 时,从 lastIndex 指示的位置开始检索;若无匹配,lastIndex 重置为 0。示例如下:

代码如下:

var p = /Java/g;
var text = "JavaScript is more fun than Java!"
var r;
while((r = p.exec(text)) != null) {
console.log(r, 'lastIndex: ' + p.lastIndex);
}

另一个方法是 test(),参数为字符串。用于检查字符串是否包含正则表达式的匹配结果,若包含则返回 true,否则返回 false。示例如下:

代码如下:

var p = /java/i;
p.test('javascript'); // true

实用工具推荐

电子包浆

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

使用 ›
图片压缩

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

使用 ›
相关文章