JavaScript 正则表达式语法详解:创建、匹配与高级用法
本文系统介绍 JavaScript 中正则表达式的两种创建方式:RegExp 构造函数与字面量,并解析 g、i、m 三种匹配标志的区别。详细讲解元字符、字符类(简单类、反向类、范围类、预定义类)、量词(贪婪与非贪婪模式)、分组捕获及边界匹配。最后通过前瞻断言示例,展示如何精准控制匹配条件,帮助开发者掌握 JS 正则表达式的核心语法与实战技巧。
JavaScript 正则表达式的创建方式
在 JavaScript 中,构建正则表达式主要存在两种实现路径。
第一种方式是利用 RegExp 构造函数进行实例化。
var pattern = new RegExp("[bc]at","i");
该构造函数接受两个参数:第一个参数用于指定匹配字符串的模式,第二个参数则是可选的标志字符串,用于控制匹配行为。
第二种方式采用字面量语法直接定义正则对象。
var pattern = /[bc]at/i;
正则表达式的匹配行为由三种特定的标志字符串决定:
g 代表 global(全局搜索模式),启用后正则表达式将应用于整个字符串,而非在找到第一个匹配项后停止;
i 代表 ignore case(忽略大小写),在匹配过程中不区分模式与字符串的大小写差异;
m 代表 multiple lines(多行模式),当搜索到达当前行末尾时,会继续在下一行中查找匹配项。
这两种创建方式的核心区别在于实例的复用性:字面量形式始终共享同一个 RegExp 实例,而通过构造函数创建的每一个新对象都是独立的实例。
元字符与字符类
元字符是正则表达式中具有特殊含义的字符。
常见的元字符包括:
( [ { \ ^ $ | ) ? * + .
在不同的组合语境下,这些元字符会呈现出不同的匹配意义。
预定义特殊字符用于简化常见字符集的匹配。

字符类中的简单类。
通常情况下,正则表达式中的一个字符对应字符串中的一个字符。但通过方括号 [] 可以构建简单类,表示符合特定特征的一类字符。例如:

[abc] 可以匹配方括号内列出的 a、b、c 中的任意一个字符或其组合。
反向类。
既然方括号可以构建包含特定字符的类,那么自然存在对应的反向类,即匹配不包含括号内内容的字符。例如 [^abc] 可以匹配不是 a、b 或 c 的任意字符。

范围类。
当需要匹配大量具有相同特征的字符时,逐个列出显得繁琐。此时可以使用连字符 "-" 来表示闭区间内的内容。例如,匹配所有小写字母可以使用 [a-z],如下:

匹配所有 0 到 9 之间的任意数字可以使用 [0-9] 表示:

预定义类。
针对上述手动创建的各类字符集,正则表达式提供了若干常用的预定义类,用于匹配常见字符类型,具体对应关系如下:
| 字符 | 等价类 | 含义 |
| . | [^\n\r] | 匹配除了回车符和换行符之外的所有字符 |
| \d | [0-9] | 数字字符 |
| \D | [^0-9] | 非数字字符 |
| \s | [\t\n\x0B\f\r] | 空白字符 |
| \S | [^\t\n\x0B\f\r] | 非空白字符 |
| \w | [a-zA-Z_0-9] | 单词字符(字母、数字和下划线) |
| \W | [^a-zA-Z_0-9] | 非单词字符 |
量词与匹配模式
量词。
前述方法均为一对一匹配。若字符连续出现多次,使用上述方法匹配将非常繁琐。因此,正则表达式提供了量词,用于直接匹配多次重复出现的字符,具体如下:
| 字符 | 含义 |
| ? | 出现零次或一次(最多一次) |
| + | 出现一次或多次(至少一次) |
| * | 出现零次或多次(任意次) |
| {n} | 出现n次 |
| {n,m} | 出现n到m次 |
| {n,} | 至少出现n次 |
贪婪模式与非贪婪模式。
对于 {n,m} 这种匹配方式,究竟是匹配 n 个还是 m 个字符,这涉及到匹配模式的选择。默认情况下,量词采取贪婪模式,即尽可能多地匹配字符。例如:
var num = '123456789';
num.match(/\d{2,4}/g); //[1234]、[5678]、[9]
与贪婪模式相对的是非贪婪模式,只需在量词后添加 "?" 即可。例如 {n,m}? 表示按照最少的字符进行匹配,如下:
var num = '123456789';
num.match(/\d{2,4}?/g); //[12]、[34]、[56]、[78]、[9]
分组与边界匹配
分组。
量词仅能作用于单个字符的多次匹配。若希望匹配某一组字符多次,正则表达式中的小括号可以将字符串整体定义为一个分组。
例如,想要匹配单词 apple 出现 4 次,可以使用 (apple){4} 进行匹配,如下:

若需匹配 apple 或 orange 出现 4 次,可以插入管道符 "|",例如:
(apple|orange){4}

当使用包含多个小括号的分组正则表达式时,匹配结果会将匹配项分组并编号。例如:
(apple)\d+(orange)

若不希望捕获某些分组,只需在分组的小括号前紧跟一个问号和冒号即可。例如:
(?:apple)\d+(orange)

边界。
正则表达式提供了几个常用的边界匹配字符,例如:
| 字符 | 含义 |
| ^ | 以xx开头 |
| $ | 以xx结尾 |
| \b | 单词边界,指[a-zA-Z_0-9]之外的字符 |
| \B | 非单词边界 |
其中单词边界匹配的是一个位置,该位置的一侧是构成单词的字符,而另一侧为非单词字符、字符串的开始或结束位置。
前瞻断言
前瞻。
前瞻用于匹配接下来出现的是或不是某一个特定的字符集。
| 表达式 | 含义 |
| exp1(?=exp2) | 匹配后面是exp2的exp1 |
| exp1(?!exp2) | 匹配后面不是exp2的exp1 |
参考以下示例:
apple(?=orange)

(/apple(?=orange)/).test('appleorange123'); //true
(/apple(?=orange)/).test('applepear345'); //false
再看另一个示例:
apple(?!orange)

(/apple(?!orange)/).test('appleorange123'); //false
(/apple(?!orange)/).test('applepear345'); //true
以上关于 JavaScript 正则表达式语法的介绍到此结束,希望能为读者提供有价值的参考。
D3.js 比例尺与坐标轴的配置详解
2026-11-05 16:54:46
JavaScript怎么遍历对象的Symbol键和不可枚举属性
2026-11-05 13:13:39
封装一个健壮的JS字符串判空工具函数
2026-11-05 12:16:14
JavaScript合并数组的三种常用方法:concat、扩展运算符与push
2026-11-05 11:22:29
JavaScript立即执行函数(IIFE)是什么及基本语法
2026-11-05 10:51:19
