JavaScript RegExp 正则表达式详解:语法、标志与属性方法

作者:半夏

时间:2026-10-26

浏览:471

本文详解 JavaScript 中 RegExp 类型的使用。涵盖正则表达式的字面量与构造函数创建方式、g/i/m/y/u/s 等标志含义、元字符转义规则,以及 global、source 等实例属性和 exec() 方法的匹配机制与捕获组处理。

文章目录

RegExp

在 ECMAScript 中,正则表达式由 RegExp 类型提供支持。其创建语法借鉴了 Perl 语言,风格简洁:

let expression = /pattern/flags;

正则表达式的 pattern(模式)部分可以是任意复杂度的正则表达式,涵盖字符类、限定符、分组、前瞻断言及反向引用等结构。每个正则表达式还可附加零个或多个 flags(标志),用于控制匹配行为。常见的匹配模式标志如下所示。

  • g:全局匹配标志,表示查找字符串中所有符合条件的内容,而非仅找到第一个匹配项即停止。
  • i:忽略大小写标志,表示在匹配过程中不区分 pattern 与字符串的大小写。
  • m:多行匹配标志,表示当匹配到一行文本末尾时,继续向后查找。
  • y:粘附(sticky)模式标志,表示仅从 lastIndex 属性指定的位置开始及之后进行查找。
  • u:Unicode 匹配标志,启用基于 Unicode 的匹配机制。
  • s:dotAll 模式标志,表示元字符 . 可以匹配包括换行符(\n 或 \r)在内的任何字符。

通过组合不同的模式与标志,可以构建出多种正则表达式,例如:

// 匹配字符串中的所有“at”
let pattern1 = /at/g;
//匹配第一个“bat”或者“cat”,忽略大小写
let pattern2 = /[bc]at/i;
//匹配所有以“at”结尾的三字符组合,忽略大小写
let pattern3 = /.at/gi;

与许多其他编程语言类似,正则表达式中的元字符在模式中均具有特殊含义,因此若需匹配这些字符本身,必须使用反斜杠进行转义。涉及的元字符包括:

( [ { \ ^ $ | ) ] } ? * + .

由于元字符在正则表达式中具备一种或多种特殊功能,若要匹配这些字符的字面量形式,必须使用反斜杠进行转义。以下示例展示了部分情况:

//匹配第一个“bat”或“cat”,忽略大小写
let pattern1 = /[bc]at/i;
//匹配第一个"[bc]at",忽略大小写
let pattern2 = /\[bc\]at/i;
//匹配所有以“at”结尾的三字符组合,忽略大小写
let pattern3 = /.at/gi;
//匹配所有".at",忽略大小写
let pattern4 = /\.at/gi

此处的 pattern1 用于匹配“bat”或“cat”,且不区分大小写。若要直接匹配字面量字符串“[bc]at”,则需如 pattern2 所示,对左右中括号均使用反斜杠进行转义。

在 pattern3 中,点号(.)表示匹配“at”之前的任意字符。若需匹配字面量字符串“.at”,则需如 pattern4 所示,对点号进行转义。

前述示例中的正则表达式均采用字面量形式定义。此外,正则表达式也可通过 RegExp 构造函数创建,该函数接收两个参数:模式字符串以及可选的标记字符串。任何使用字面量定义的正则表达式均可通过构造函数等价创建,例如:

//匹配第一个“bat”或“cat”,忽略大小写
let pattern1 = /[bc]at/i;
//跟pattern1一样,只不过是用构造函数创建的
let pattern2 = new RegExp("[bc]at","i");

此处的 pattern1 与 pattern2 是等效的正则表达式。需注意,RegExp 构造函数的两个参数均为字符串类型。由于模式参数是字符串,因此在某些情况下需要进行二次转义。所有元字符均需二次转义,包括转义字符序列,例如 \n(\ 转义后的字符串是 \,在正则表达式字符串中则需写成 \\)。

字面量模式对应的字符串
/ \ [bc \ ]at/“\ \ [bc \ \ ]at”
/ \ .at/“\ \ .at”
/name \ /age/“name\ /age”
/ \d.\d{1,2}/“\ \d.\ \d{1,2}”
/ \ w\ \hello \ \123/“\ \w \ \ \ \hello\ \ \ \123”

此外,使用 RegExp 构造函数还可以基于已有的正则表达式实例进行创建,并可选择性地修改其标记:

const rel = /cat/g;
console.log(rel); // "cat/g"
const re2 = new RegExp(rel);
console.log(re2); // "cat/g"

RegExp 实例属性

每个 RegExp 实例均包含下列属性,提供关于模式的各类信息。

  • global:布尔值,表示是否设置了 g 标志。
  • ignoreCase:布尔值,表示是否设置了 i 标志。
  • unicode:布尔值,表示是否设置了 u 标志。
  • sticky:布尔值,表示是否设置了 y 标志。
  • lastIndex:整数,表示在源字符串中下一次搜索的起始位置,初始值始终为 0。
  • multiline:布尔值,表示是否设置了 m 标志。
  • dotAll:布尔值,表示是否设置了 s 标志。
  • source:正则表达式的字面量字符串形式(而非传给构造函数的模式字符串),不包含开头和结尾的斜杠。
  • flags:正则表达式的标志字符串。始终以字面量形式返回(不包含前后斜杠),而非传入构造函数的字符串模式。
let pattern1 = /\[bc\]at/i;
console.log(pattern1.global); //false
console.log(pattern1.ignoreCase); //true
console.log(pattern1.multiline); //false
console.log(pattern1.lastIndex); //0
console.log(pattern1.source); //"\[bc\]at"
console.log(pattern1.flags); //"i"

RegExp 实例方法

RegExp 实例的主要方法是 exec(),主要用于配合捕获组使用。该方法仅接受一个参数,即要应用模式的字符串。若找到匹配项,则返回包含第一个匹配信息的数组;若未找到匹配项,则返回 null。返回的数组虽然是 Array 的实例,但包含两个额外属性:index 和 input。其中,index 表示字符串中匹配模式的起始位置,input 表示要查找的原始字符串。该数组的第一个元素是匹配整个模式的字符串,其他元素是与表达式中的捕获组匹配的字符串。若模式中没有捕获组,则数组仅包含一个元素。参考以下示例:

let text = 'mom and dad and baby';
let pattern = /mom( and dad(and baby)?)?/gi;
let matches = pattern.exec(text);
console.log(matches.index); // 0
console.log(matches.input); //"mom and dad and baby"
console.log(matches[0]); //"mom and dad and baby"
console.log(matches[1]); //" and dad and baby"

到此这篇关于 JavaScript 通过 RegExp 使用正则表达式过程详解的文章就介绍到这了,更多相关JS RegExp内容请搜索本站以前的文章或继续浏览下面的相关文章希望大家以后多多支持本站!

实用工具推荐

电子包浆

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

使用 ›
图片压缩

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

使用 ›
相关文章