JavaScript RegExp 对象
RegExp(正则表达式)是一套"模式匹配"语法:用一段紧凑的符号描述字符串的规则,再让引擎去查找、替换、校验。它能一行代码完成"验证手机号格式""提取日志里的 IP""把文本里的日期全部替换"等操作。RegExp 是 JavaScript 的内置对象,既可以直接用字面量写,也可以 new 出来复用。
创建正则的两种方式
字面量写法用斜杠包住模式;new RegExp() 接受字符串,适合动态拼规则:
let re1 = /ab+c/; // 字面量:b 至少出现一次
let re2 = new RegExp("ab+c"); // 等价写法
console.log(re1.test("abbbc")); // 输出:true,匹配成功
console.log(re2.test("ac")); // 输出:false,缺中间的 b
let key = "car";
let re3 = new RegExp("^" + key + "$"); // 字符串拼接出动态规则
console.log(re3.test("car")); // 输出:true
注意用字符串写正则时,反斜杠要写成双反斜杠,比如 new RegExp("\d") 才表示数字。
修饰符:g / i / m
修饰符跟在斜杠后面,决定匹配方式:g 全局、i 忽略大小写、m 多行:
let text = "Apple apple APPLE";
console.log(text.match(/apple/)); // 输出:[ 'apple' ],只找第一个
console.log(text.match(/apple/i)); // 输出:[ 'Apple' ],忽略大小写
console.log(text.match(/apple/gi)); // 输出:[ 'Apple', 'apple', 'APPLE' ]
console.log(/^b/m.test("a\nb\nc")); // 输出:true,m 让 ^ 匹配每行开头
没有 g 时 match 只返回第一处;带上 g 才返回全部结果数组。
常用字符与元字符
掌握几个万能符号就能覆盖大部分需求:\d 数字、\w 字母数字下划线、\s 空白,[] 字符集,^ $ 是行首行尾锚点:
console.log(/\d/.test("abc123")); // 输出:true,含数字
console.log("138-1234-5678".match(/\d+/g)); // 输出:[ '138', '1234', '5678' ]
console.log("Hello World".match(/\w+/g)); // 输出:[ 'Hello', 'World' ]
console.log(/^cat/.test("cat and dog")); // 输出:true,以 cat 开头
console.log(/dog$/.test("cat and dog")); // 输出:true,以 dog 结尾
console.log(/colou?r/.test("color")); // 输出:true,u? 表示可有可无
console.log(/^1[3-9]\d{9}$/.test("13812345678")); // 输出:true,粗验手机号
量词星号 * 表示 0 次或多次、加号 + 表示 1 次以上、{n,m} 精确控制次数;"." 匹配任意字符(除换行)。
字符串里的正则方法
search、match、replace、split 四个字符串方法都接受正则,是正则最常用的入口:
let s = "今天是2025年5月1日";
console.log(s.search(/\d+/)); // 输出:3,返回首个匹配位置
console.log(s.match(/\d+/g)); // 输出:[ '2025', '5', '1' ]
console.log(s.replace(/\d+/g, "X"));// 输出:今天是X年X月X日
console.log("a,b;c".split(/[,;]/)); // 输出:[ 'a', 'b', 'c' ]
replace 配合 g 修饰符即可做到"全局替换",比普通字符串 replace 强大得多。
RegExp 方法:test / exec
test 只回答"有没有",返回布尔;exec 返回更详细的匹配结果,第一个元素是匹配到的文本:
let re = /\d{4}-\d{2}-\d{2}/; // 形如 2025-05-01 的日期
console.log(re.test("今天是2025-05-01")); // 输出:true
let m = re.exec("生日:2025-05-01");
console.log(m[0]); // 输出:2025-05-01
console.log(m.index); // 输出:3,匹配开始的位置
console.log(re.exec("没有日期")); // 输出:null,找不到
表单校验常用的套路就是 if (!/规则/.test(输入)) { 提示错误 }。
分组与捕获:圆括号
用圆括号把模式分成几组,exec 或 match 的结果里就能单独取出每一组:
let re = /(\d{4})-(\d{2})-(\d{2})/;
let m = re.exec("生日:2025-05-01");
console.log(m[0]); // 输出:2025-05-01,整段匹配
console.log(m[1], m[2], m[3]); // 输出:2025 05 01,三个分组
console.log("2025-05-01".replace(re, "$3/$2/$1")); // 输出:01/05/2025,调换顺序
分组在提取数据(如解析身份证号、日志字段)时极其好用,$1、$2 可以在 replace 的替换串里引用分组。
小结:RegExp 是 JS 的文本模式匹配工具,可用字面量 /模式/ 或 new RegExp() 创建;记住 g/i/m 修饰符与 \d、\w、[]、^$、*+?、{n,m} 这些符号;搭配字符串的 search/match/replace/split,或正则自己的 test/exec,就能完成校验、提取、替换三大类任务。