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,就能完成校验、提取、替换三大类任务。

笔记加载中…