JavaScript 正则表达式语法详解:创建、匹配与高级用法

作者:异步漫步时间:2026-10-30 12:31:32浏览:381

本文系统介绍 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 实例,而通过构造函数创建的每一个新对象都是独立的实例。

元字符与字符类

元字符是正则表达式中具有特殊含义的字符。

常见的元字符包括:

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

在不同的组合语境下,这些元字符会呈现出不同的匹配意义。

预定义特殊字符用于简化常见字符集的匹配。

JavaScript 正则表达式的创建方式

字符类中的简单类。

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

JavaScript 正则表达式的创建方式

[abc] 可以匹配方括号内列出的 a、b、c 中的任意一个字符或其组合。

反向类。

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

JavaScript 正则表达式的创建方式

范围类。

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

JavaScript 正则表达式的创建方式

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

JavaScript 正则表达式的创建方式

预定义类。

针对上述手动创建的各类字符集,正则表达式提供了若干常用的预定义类,用于匹配常见字符类型,具体对应关系如下:

字符   等价类   含义
.   [^\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} 进行匹配,如下:

JavaScript 正则表达式的创建方式

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

(apple|orange){4}

JavaScript 正则表达式的创建方式

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

(apple)\d+(orange)

JavaScript 正则表达式的创建方式

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

(?:apple)\d+(orange)

JavaScript 正则表达式的创建方式

边界。

正则表达式提供了几个常用的边界匹配字符,例如:

字符 含义
^ 以xx开头
$ 以xx结尾
\b 单词边界,指[a-zA-Z_0-9]之外的字符
\B 非单词边界

其中单词边界匹配的是一个位置,该位置的一侧是构成单词的字符,而另一侧为非单词字符、字符串的开始或结束位置。

前瞻断言

前瞻。

前瞻用于匹配接下来出现的是或不是某一个特定的字符集。

表达式 含义
exp1(?=exp2) 匹配后面是exp2的exp1
exp1(?!exp2) 匹配后面不是exp2的exp1

参考以下示例:

apple(?=orange)

JavaScript 正则表达式的创建方式


(/apple(?=orange)/).test('appleorange123'); //true 
(/apple(?=orange)/).test('applepear345'); //false 

再看另一个示例:

apple(?!orange)

JavaScript 正则表达式的创建方式


(/apple(?!orange)/).test('appleorange123'); //false 
(/apple(?!orange)/).test('applepear345'); //true 

以上关于 JavaScript 正则表达式语法的介绍到此结束,希望能为读者提供有价值的参考。

作者最新文章