JavaScript正则表达式定义与语法详解
本文详细解析JavaScript中正则表达式的两种定义方式及其底层机制,重点对比ECMAScript 3与5在RegExp对象复用上的差异。同时系统梳理了直接量字符、字符类、重复次数、分组引用、锚点及修饰符等核心语法,帮助开发者掌握正则匹配规则与陷阱。
本文主要介绍JavaScript中正则表达式的定义方式与相关语法规范,供读者参考学习。
正则表达式的定义方法
在JavaScript中,正则表达式主要有两种定义途径:一是通过构造函数RegExp()进行实例化;二是采用字面量方式,即使用var re = /正则规则/;的形式直接定义。
尽管上述两种定义方式在写法上有所不同,但其本质最终都会调用RegExp()构造函数来创建正则对象。
值得注意的是,针对同一段正则代码的执行行为,在ECMAScript 3标准与ECMAScript 5标准下存在显著差异。
ECMAScript版本差异
function reg(){
var re = /\sjavascript/;
return re;
}
分别在ECMAScript3和ECMAScript5中调用reg()方法多次
在ECMAScript 3环境中,多次调用reg()返回的是同一个RegExp对象实例;而在ECMAScript 5及更高版本中,每次执行都会生成一个新的RegExp对象实例。
这种差异在ECMAScript 3中可能引发程序隐患:若在某处修改了该共享RegExp对象的属性(如lastIndex),所有引用该对象的代码都会受到波及,导致状态不一致。
正则语法详解
1. 直接量字符
正则表达式中最基础的操作是直接匹配具体字符,例如:
/javascript/ 会精确匹配字符串中的javascript文本。
除了字母,正则还支持匹配非字母的特殊字符,具体包括:
\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
在正则表达式中,部分标点符号具有特殊含义,若需匹配这些字符本身,必须使用反斜杠\进行转义。
^$.*+?=!:|\/()[]{}
2. 字符类
[...] 表示匹配方括号内的任意一个字符
[^...] 表示匹配不在方括号内的任意字符
. 表示匹配除换行符以外的任意单个字符
\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] 匹配退格直接量,这是一个特例写法
3. 重复(次数)
? 表示匹配0次或1次
+ 表示匹配1次或多次
* 表示匹配任意次数(包括0次)
{n} 表示精确匹配n次
{m,n} 表示最少匹配m次,最多匹配n次
{n,} 表示匹配n次或n次以上
正则表达式默认采用贪婪匹配模式。
例如对于模式[a+b+],若输入字符串为aaabb,它将匹配整个aaabb,而不会匹配ab或aab等较短子串。
若使用模式[a+?b+?],则会匹配aaab。为何会产生这种区别?
这是因为+?启用了非贪婪匹配模式,使得b部分仅匹配一个b。至于a为何匹配3个,是因为正则表达式的匹配机制总是优先寻找字符串中第一个可能的匹配位置,并尽可能多地消耗字符,直到后续部分无法匹配为止。
4. 选项、分组与引用
| 用于分隔可选字符,如[ab|cd]既可匹配ab也可匹配cd。需注意,选择项的尝试顺序是从左到右,因此对于[a|ab],当a匹配成功后,即使ab是更优匹配也不会继续尝试。
() 具有两种主要作用:1. 将单独项视为子表达式,如/java(script)?/可匹配javascript和java,圆括号部分形成子表达式,可对其执行|、*、?等操作;2. 在完整模式中定义子模式,后续可通过反向引用访问。
例如/(['"])[a-z]\1/,其中\1引用了第一个圆括号内的表达式['"],从而确保前后引号一致。
3. 后部引用前面的子表达式。需注意,/['"][a-z]['"]/的含义是单引号或双引号后接小写字母,再接单引号或双引号,此时前后引号无需匹配。若需强制匹配相同引号,应写作[(['"])[a-z]\1]。
\加数字(如\1, \2)可直接引用前面圆括号中定义的子表达式。
5. 制定匹配位置(锚点)
^ 匹配字符串的开头;在多行检索模式下,匹配每一行的开头。
$ 匹配字符串的结尾;在多行检索模式下,匹配每一行的结尾。
\b 匹配单词边界,即位于字符\w和\W之间,或位于字符\w与字符串开头/结尾之间的位置。
\B 匹配非单词边界的位置。
(?=p) 零宽正向先行断言,要求接下来的字符必须与p匹配,但匹配结果不包含p本身。
(?!p) 零宽负向先行断言,要求接下来的字符不与p匹配。
修饰符与注意事项
6. 修饰符
修饰符位于正则表达式字面量//的右侧。
i 执行不区分大小写的匹配。
g 执行全局匹配,即找到所有匹配项,而非在找到第一个匹配后停止。
m 启用多行匹配模式,此时^匹配每一行的开头(以及字符串开头),$匹配每一行的结尾(以及字符串结尾)。例如/java$/m可匹配java\nfunc中的java。
需注意:当正则表达式设置了全局修饰符g时,每次调用exec()或test()方法都会将当前设置的lastIndex属性更新为当前匹配位置。再次执行时,将从lastIndex指定的位置开始搜索。因此,建议在每次执行前手动将lastIndex重置为0,以避免潜在的状态残留问题。
希望本文所述内容能对JavaScript程序设计有所帮助。
JS处理含Emoji或中文的字符串转数组乱码问题
2026-11-05 16:12:28
JS怎么使用展开运算符合并对象
2026-11-05 14:42:18
ES6+环境下判断JS对象为空的简洁写法
2026-11-05 12:12:23
怎么通过replacer函数自定义JS中JSON的格式化输出
2026-11-05 11:19:44
JS正则表达式基础:字面量与RegExp构造函数的区别及常用元字符
2026-11-05 11:16:58
