📝 JavaScript 正则表达式核心知识点总结
我帮你把正则的核心概念、常用语法、熟练记忆点和实战技巧整理成体系,新手也能快速掌握,机考/面试中能直接用。
一、正则基础核心(必须记)
1. 正则的两种创建方式
// 1. 字面量形式(推荐,简洁,无转义坑)
const reg1 = /abc/g;
// 2. 构造函数形式(适合动态拼接规则)
const str = "abc";
const reg2 = new RegExp(str, "g");✅ 记忆点:
字面量用
/规则/修饰符,构造函数用new RegExp(规则字符串, 修饰符);构造函数中特殊字符需要双重转义(如
/\d/→new RegExp("\\d"))。
2. 三大修饰符(高频)
| 修饰符 | 含义 | 常用场景 |
|---|---|---|
g | 全局匹配(不匹配一次就停止) | 替换所有匹配项、提取所有符合规则的内容 |
i | 忽略大小写 | 不区分大小写的搜索/验证(如手机号、邮箱) |
m | 多行匹配(^/$ 匹配每行开头/结尾) | 处理多行文本(如日志、多行输入) |
✅ 记忆点:g(全局)、i(忽略大小写)、m(多行)是最常用的三个,组合使用如 /abc/gi。 |
二、正则元字符(分类型记,重点)
1. 字符匹配类(核心)
| 元字符 | 含义 | 示例 |
|---|---|---|
. | 匹配除换行符外的任意单个字符 | /a.c/ 匹配 abc、a1c,不匹配 ac、a\nc |
\d | 匹配数字(0-9) | /\d{3}/ 匹配 123、456 |
\D | 匹配非数字 | /\D/ 匹配 a、@,不匹配 5 |
\w | 匹配字母、数字、下划线(等价 [a-zA-Z0-9_]) | /\w+/ 匹配 abc123_ |
\W | 匹配非字母/数字/下划线 | /\W/ 匹配 @、(空格) |
\s | 匹配空白符(空格、制表符、换行等) | /\s+/ 匹配多个空格 |
\S | 匹配非空白符 | /\S/ 匹配 a、1,不匹配空格 |
| ✅ 记忆点: |
小写(
\d/\w/\s)匹配“目标类型”,大写(\D/\W/\S)匹配“非目标类型”;.是“万能匹配”,但不包含换行符,如需匹配所有(含换行)用[\s\S]。
2. 边界匹配类(易错点)
| 元字符 | 含义 | 示例 |
|---|---|---|
^ | 匹配字符串开头(m 模式下匹配每行开头) | /^abc/ 匹配 abc123,不匹配 123abc |
$ | 匹配字符串结尾(m 模式下匹配每行结尾) | /abc$/ 匹配 123abc,不匹配 abc123 |
\b | 匹配单词边界(字母/数字与非字母/数字的分界) | /\bis\b/ 匹配 this is 中的 is,不匹配 this 中的 is |
\B | 匹配非单词边界 | /\Bis\B/ 匹配 island 中的 is |
| ✅ 记忆点: |
^是“开头”,$是“结尾”,组合/^xxx$/用于精确匹配(如手机号、邮箱验证);验证类正则必须加
^$(否则13800138000a也会被/1\d{10}/匹配)。
3. 量词类(控制匹配次数,高频)
| 量词 | 含义 | 示例 |
|---|---|---|
* | 匹配 0 次或多次(贪婪) | /a*/ 匹配 ""、a、aaa |
+ | 匹配 1 次或多次(贪婪) | /a+/ 匹配 a、aaa,不匹配 "" |
? | 匹配 0 次或 1 次(贪婪) | /a?/ 匹配 ""、a,不匹配 aa |
{n} | 匹配恰好 n 次 | /a{3}/ 匹配 aaa,不匹配 aa、aaaa |
{n,} | 匹配至少 n 次(贪婪) | /a{2,}/ 匹配 aa、aaa |
{n,m} | 匹配 n 到 m 次(贪婪) | /a{2,4}/ 匹配 aa、aaa、aaaa |
*?/+?/?? | 非贪婪匹配(尽可能少匹配) | a+? 匹配 aaa 时只取第一个 a |
| ✅ 记忆点: |
贪婪匹配(默认):“能多取就多取”;非贪婪匹配(加
?):“能少取就少取”;常用组合:
手机号:
/^1\d{10}$/(1开头,后面10位数字);非空字符串:
/^\S+$/(至少1个非空白符)。
4. 分组与分支类
| 语法 | 含义 | 示例 |
|---|---|---|
() | 分组(将多个字符视为整体) | /(ab)+/ 匹配 ab、abab,不匹配 aab |
| ` | ` | 分支(或) |
\n | 反向引用(引用第 n 个分组的内容) | /(\w)\1/ 匹配 aa、22、__ |
| ✅ 记忆点: |
分组优先于分支,复杂规则用
()明确范围(如/a(b|c)d/匹配abd、acd);反向引用常用于匹配重复字符(如连续相同数字、成对括号)。
三、正则常用方法(必须掌握)
1. 字符串方法(更常用)
| 方法 | 作用 | 示例 |
|---|---|---|
str.match(reg) | 提取匹配结果(g 修饰符返回所有匹配,否则返回第一个) | "123abc456".match(/\d+/g) → ["123", "456"] |
str.replace(reg, newStr/函数) | 替换匹配内容 | "a1b2c3".replace(/\d/g, "*") → "a*b*c*" |
str.search(reg) | 查找第一个匹配的索引(无则返回 -1) | "abc123".search(/\d/) → 3 |
str.split(reg) | 按正则规则分割字符串 | "a,b;c".split(/[,;]/) → ["a", "b", "c"] |
2. 正则对象方法
| 方法 | 作用 | 示例 |
|---|---|---|
reg.test(str) | 检测字符串是否匹配(返回布尔值) | /^\d+$/.test("123") → true |
reg.exec(str) | 提取匹配结果(可配合 g 循环提取所有) | 循环调用 exec 可逐次获取匹配项 |
| ✅ 记忆点: |
验证类场景用
reg.test(str)(如验证手机号是否合法);提取类场景用
str.match(reg)(加g提取所有);替换类场景用
str.replace(reg, 替换值)(支持函数动态替换)。
四、必须熟练记忆的“高频正则片段”
直接背下来,机考/开发中能直接套用:
手机号验证:
/^1\d{10}$/邮箱验证(简易版):
/^[\w.-]+@[a-zA-Z0-9-]+.[a-zA-Z]{2,6}$/身份证号(18位):
/^\d{17}[\dXx]$/匹配所有数字:
/\d+/g匹配中文字符:
/[\u4e00-\u9fa5]+/g去除首尾空格:
str.replace(/^\s+|\s+$/g, "")(或用str.trim(),但正则更灵活)替换所有空格:
str.replace(/\s+/g, "")匹配URL:
/^https?://[^\s]+$/提取字符串中的数字:
str.match(/\d+/g) || []验证是否为纯数字:
/^\d+$/.test(str)
五、避坑指南(易错点)
转义问题:字面量中
\是转义符,构造函数中需要\\(如/./→new RegExp("\."));贪婪 vs 非贪婪:默认贪婪,如需“最短匹配”加
?(如<div>1</div><div>2</div>匹配单个标签用/<div>.*?</div>/);精确匹配:验证类正则必须加
^$(否则部分匹配会误判);换行符匹配:
.不匹配换行,如需匹配所有字符用[\s\S]或[\d\D];反向引用:分组编号从 1 开始,
\0代表整个匹配项。
六、核心总结(记忆关键点)
三大修饰符:
g(全局)、i(忽略大小写)、m(多行);核心元字符:
\d(数字)、\w(单词字符)、\s(空白),大写是反义;量词核心:
+(1+)、*(0+)、?(0/1)、{n,m}(范围),加?非贪婪;边界匹配:
^(开头)、$(结尾)组合实现精确验证;常用方法:
test(验证)、match(提取)、replace(替换);高频片段:手机号、邮箱、去空格等直接套用,不用重复写。
如果需要,我可以帮你整理一份正则实战练习题(带答案),包含验证、提取、替换等场景,帮你巩固记忆。需要吗?
(注:文档部分内容可能由 AI 生成)