JavaScript正则表达式是RegExp对象,用于字符串匹配与处理;创建方式有字面量(/abc/gi)和构造函数(new RegExp('abc','gi')),后者需双写反斜杠;test()返回布尔值,exec()返回匹配详情并维护lastIndex;.不匹配换行符,贪婪量词易过度匹配,Unicode需u标志或[\s\S];实际应用应优先使用成熟校验库。

JavaScript 正则表达式是内建的模式匹配工具,本质是一个 RegExp 对象,用来描述、查找、替换符合特定规则的字符串。它不是“高级技巧”,而是日常处理表单校验、URL 解析、日志提取等任务的基础设施。
怎么创建正则表达式?字面量 vs 构造函数
两种方式,行为基本一致,但动态拼接时必须用构造函数,否则字面量写法无法插入变量。
- 字面量:
/abc/gi—— 简洁,适合静态模式,斜杠之间是模式,后面是标志(如g全局、i忽略大小写) - 构造函数:
new RegExp('abc', 'gi')—— 模式和标志分离,支持字符串拼接,但反斜杠需双写('\\d+'而非'\d+') - 错误高发点:用构造函数时忘记转义反斜杠,导致
new RegExp('\d+')实际传入的是'd+'(因为\d在字符串中被解释为非法转义),应写成new RegExp('\\d+')
test() 和 exec() 的核心区别
test() 只返回布尔值,适合判断“有没有匹配”;exec() 返回匹配详情(包括捕获组、索引),且在全局模式下会维护 lastIndex,多次调用可迭代匹配。
const re = /a(b)/g;
console.log(re.test('abab')); // true
console.log(re.exec('abab')); // ['ab', 'b', index: 0, input: 'abab']
console.log(re.exec('abab')); // ['ab', 'b', index: 2, input: 'abab'] —— 继续从位置 2 开始
console.log(re.exec('abab')); // null —— 已无更多匹配
- 反复调用
exec()前,记得检查re.lastIndex是否被意外修改(比如其他代码复用了同一个正则对象) - 非全局正则调用
exec()每次都从开头匹配,lastIndex不起作用 - 想重置匹配位置?手动设
re.lastIndex = 0
常见陷阱:点号 .、量词、Unicode 字符
. 默认不匹配换行符(\n、\r),这常导致多行文本匹配失败;* 和 + 是贪婪的,容易“吃掉太多”;中文、emoji 等 Unicode 字符可能被拆成多个码元,影响 \w 或 . 行为。
立即学习“Java免费学习笔记(深入)”;
- 让
.匹配换行:加s标志(/a.b/s),注意该标志在旧版 Safari 中不支持 - 避免贪婪匹配:用
*?或+?(懒惰量词),例如/a.*?b/匹配最短的以 a 开头、b 结尾的子串 - 匹配任意 Unicode 字符(含 emoji):用
[\s\S]替代.,或升级到 ES2018 后使用u标志 +.(/./u) -
\w在无u标志时只匹配 ASCII 字母数字,中文会被忽略;要匹配中文,请显式写[\u4e00-\u9fa5]或用/.+/u配合String.prototype.codePointAt等辅助逻辑
正则真正难的不是语法,而是把自然语言需求准确翻译成字符约束条件——比如“邮箱格式”看似简单,但 RFC 5322 定义的合法邮箱远超 /^\S+@\S+\.\S+$/;实际项目中,优先用成熟库(如 validator.js)或服务端校验,前端正则只做基础过滤即可。











