在JavaScript中,正则表达式是一种描述字符串模式的工具,它建立在有限状态机原理之上,用来快速判断一段文本是否符合规则,或者从中抽取、改写特定部分。很多文本处理任务如果只用字符串的indexOf和slice,代码会变得又长又难维护,而正则可以用一行表达式表达复杂的匹配逻辑。

一、JavaScript中正则的两种创建方式
JavaScript提供了两种写正则表达式的方法。第一种是使用斜杠字面量,形式为/pattern/flags,写在代码里直观且会被引擎提前编译,适合固定模式。第二种是通过内置的RegExp构造函数,接收字符串参数,能在运行时动态拼接规则,但需要注意反斜杠要写两次来做转义。
下面用两种写法表达同一个需求:匹配连续三位数字。字面量方式直接写成/d{3}/,而构造函数要传入'\d{3}',因为字符串里的d本身会被当作转义序列处理。选择哪种看场景,如果规则来自后台配置或用户输入,就必须用构造函数;如果是写死的校验逻辑,字面量更干净。
// 字面量写法
const re1 = /d{3}/;
// 构造函数写法(注意双反斜杠)
const re2 = new RegExp('\d{3}');
console.log(re1.test('abc123')); // true
console.log(re2.test('abc123')); // true
二、正则的基础语法构成
要写出能用的正则,先理解几个核心概念。字符类用方括号表示可选项,比如[a-z]匹配任意小写字母;预定义类如d代表数字、w代表单词字符。量词控制前面单元的出现次数,*是零次或多次,+是一次或多次,{n,m}是n到m次。锚点^和$分别匹配开头和结尾,保证整段字符串而非局部符合条件。
分组用圆括号,既能把多次重复的内容圈起来,又能提取子匹配。例如(d{4})-(d{2})可以把年月分开捕获。竖线表示或逻辑,cat|dog匹配其中之一。初学者常忽略贪婪问题:默认量词会尽可能多吃字符,在后面加问号如+?变成非贪婪,只匹配最短满足部分,处理HTML片段时尤其重要。
// 提取日期中的年和月
const str = '2024-03-15';
const pattern = /(d{4})-(d{2})/;
const result = str.match(pattern);
console.log(result[1]); // 2024
console.log(result[2]); // 03
// 非贪婪匹配示例
const html = '<div>内容</div>';
const tag = /<.*?>/; // 只匹配到第一个标签
console.log(html.match(tag)); // [<div>]
三、用match和test做字符串匹配
匹配阶段最常用的是test和match。test返回布尔值,适合做表单校验,比如判断手机号格式。match在字符串上调用,传入正则,若不带全局标记g返回类数组结果,包含整体匹配和捕获组;带g时返回所有匹配组成的数组,但不再提供分组细节,需要配合exec循环获取。
实际项目中,校验邮箱就可以用test。下面例子里的正则要求开头是单词字符,接着@符号,域名部分含点号。虽然真实邮箱规则更复杂,但作为前端初步拦截已经够用。注意如果正则有g标记,test会因lastIndex状态导致连续调用结果交替,因此校验场景一般不加g。
const emailRe = /^w+@w+.w+$/;
console.log(emailRe.test('user@ipipp.com')); // true
console.log(emailRe.test('bad@com')); // false
const allNums = 'a1b22c333'.match(/d+/g);
console.log(allNums); // ['1', '22', '333']
四、使用replace完成字符串替换
replace是字符串替换的主角。最简单形式是传入字符串和替换值,但更强大的是第二个参数用函数。函数接收匹配内容、各个分组、偏移量和原串,返回新字符串,从而实现动态改写。比如把价格文本里的数字加粗,或把手机号中间四位打码。
另外replace配合捕获组用$1、$2引用也很方便。下例把姓,名格式翻转为名 姓。如果逻辑复杂,比如要把匹配到的数字乘二,就必须用函数形式。需要提醒,替换不会修改原字符串,而是返回新串,记得接收返回值。
// 用分组翻转姓名
const nameStr = 'Zhang,San';
const swapped = nameStr.replace(/(w+),(w+)/, '$2 $1');
console.log(swapped); // San Zhang
// 用函数把数字乘二
const text = '尺寸:10 和 20';
const doubled = text.replace(/d+/g, function(match) {
return Number(match) * 2;
});
console.log(doubled); // 尺寸:20 和 40
五、常见误区与写法建议
一个典型误区是滥用点号.去匹配一切,包括换行。默认点号不匹配换行符,处理多行文本要加s标记(ES2018起支持)或用[sS]替代。另一个坑是忘记转义,在构造函数里传字符串时,反斜杠必须双写,否则d变成普通d,规则完全失效。
建议把复杂正则拆成多段并用注释说明,或拆成多个小正则分步处理,可读性比炫技更重要。写完后用典型和边界数据测试,比如空串、超长串、特殊符号混排。正则虽强,但不是万能,涉及嵌套结构如JSON或HTML深层嵌套时,应改用解析器而非正则。
| 场景 | 推荐方式 | 注意点 |
|---|---|---|
| 固定格式校验 | 字面量正则+test | 不加g标记 |
| 动态规则 | new RegExp拼接 | 双写反斜杠 |
| 提取多组内容 | match或exec循环 | 全局标记下分组丢失 |
| 复杂改写 | replace传函数 | 接收返回新串 |
通过上述写法,JavaScript正则既能完成精准匹配,也能灵活替换。多在控制台试验不同flags组合,如i忽略大小写、m多行锚点,逐步积累对元字符的直觉,文本处理效率会明显提升。
javascript正则表达式字符串替换修改时间:2026-08-06 18:24:46