JavaScript正则表达式终极指南:从入门到精通(含实战案例)

** 本文是一份详尽的JavaScript正则表达式教程,从基础语法到高级技巧,结合大量实战案例,助你彻底掌握这个强大的文本处理工具,无论你是前端新手还是希望查漏补缺的开发者,本指南都将是你不可或缺的案头手册。

javascript 正则表达式 教程
(图片来源网络,侵删)

H1:JavaScript正则表达式终极指南:从入门到精通(含实战案例)

H2:前言:为什么每个JavaScript开发者都必须掌握正则表达式?

在JavaScript的世界里,我们每天都在与字符串打交道:验证用户输入、解析配置文件、提取关键信息、替换特定文本…… 当面对这些复杂的文本处理任务时,循环和条件判断往往显得力不从心且代码臃肿。

这时,正则表达式 就像一把瑞士军刀,它提供了一种强大、简洁且高效的方式来匹配、搜索、提取和操作文本,掌握它,意味着你拥有了处理文本的“超能力”,能写出更优雅、更健壮、更高效的代码,本教程将带你一步步揭开正则表达式的神秘面纱,从零基础到实战应用,让你彻底爱上这个强大的工具。


H2:第一部分:正则表达式入门 - 认识你的第一个“模式”

H3:什么是正则表达式?

正则表达式(Regular Expression,简称Regex或RegExp)是一个由字符元字符组成的、描述字符串匹配模式的特殊字符串,它就是一套规则,用来定义我们想要查找的文本长什么样。

/hello/ 就是一个最简单的正则表达式,它的作用是匹配字符串中是否包含 "hello" 这个连续的字符序列。

javascript 正则表达式 教程
(图片来源网络,侵删)

H3:在JavaScript中如何创建正则表达式?

JavaScript提供了两种创建正则表达式对象的方式:

  1. 字面量方式 (推荐):使用斜杠 将模式包围起来,这种方式简洁、直观,是日常开发中的首选。

    const regex = /hello/;
  2. 构造函数方式:使用 new RegExp() 构造函数,这种方式更灵活,允许我们动态地构建正则表达式模式(模式来自用户输入或变量)。

    const pattern = 'world';
    const regex = new RegExp(pattern);
    // 或者包含特殊字符时需要双重转义
    const specialRegex = new RegExp('\\d+'); // 匹配一个或多个数字

H2:第二部分:核心语法 - 构建你的匹配规则

正则表达式的强大之处在于其丰富的语法,我们将其分为三大块:字符类、量词、和定位符

javascript 正则表达式 教程
(图片来源网络,侵删)

H3:1. 字符类 - 匹配某一类字符

字符类用于匹配一个字符集合中的任意一个字符。

元字符 描述 示例 匹配
[...] 匹配方括号内的任意一个字符 [abc] "a", "b", "c"
[^...] 匹配方括号内的任意一个字符 [^abc] "d", "1", "@"
[a-z] 匹配指定范围内的任意小写字母 [a-z] "a" 到 "z"
[A-Z] 匹配指定范围内的任意大写字母 [A-Z] "A" 到 "Z"
[0-9] 匹配任意数字 [0-9] "0" 到 "9"
\d 匹配任意数字(等同于 [0-9] \d "1", "8", "0"
\D 匹配数字(等同于 [^0-9] \D "a", "!", " "
\w 匹配任意“单词”字符(字母、数字、下划线) \w "a", "1", "_"
\W 匹配“单词”字符 \W "!", "@", " "
\s 匹配任意空白字符(空格、制表符、换行等) \s " ", "\t", "\n"
\S 匹配空白字符 \S "a", "1", "@"

实战案例: 验证一个简单的手机号(假设为1开头,第二位是3-9,后面是9位数字)

const phoneRegex = /^1[3-9]\d{9}$/;
console.log(phoneRegex.test('13812345678')); // true
console.log(phoneRegex.test('12812345678')); // false (第二位不对)
console.log(phoneRegex.test('1381234567'));  // false (位数不够)

H3:2. 量词 - 指定匹配次数

量词跟在字符或字符类后面,用来指定前面的元素需要出现多少次。

量词 描述 示例 匹配
匹配前面的元素零次或多次 go*gle "gogle", "google", "gooogle"
匹配前面的元素一次或多次 go+gle "google", "gooogle" (不匹配 "gogle")
匹配前面的元素零次或一次 colou?r "color", "colour"
{n} 匹配前面的元素恰好n次 \d{3} "123", "456"
{n,} 匹配前面的元素至少n次 \d{2,} "12", "123", "1234"
{n,m} 匹配前面的元素至少n次,但不超过m次 \d{2,4} "12", "123", "1234" (不匹配 "12345")

实战案例: 提取HTML标签中的内容

const html = '<div>你好,世界!</div>';
const tagRegex = /<div>(.*?)<\/div>/; // ? 表示非贪婪匹配,后面会讲
const match = html.match(tagRegex);
console.log(match[1]); // 输出: "你好,世界!"

H3:3. 定位符 - 指定匹配位置

定位符(也称为“锚点”)本身不匹配任何字符,而是匹配一个位置。

定位符 描述
^ 匹配字符串的开头
匹配字符串的
\b 匹配“单词”的边界(单词字符和非单词字符之间)
\B 匹配单词边界

实战案例: 验证用户密码(必须以字母开头,以数字结尾,长度6-16位)

const passwordRegex = /^[a-zA-Z]\w{4,14}\d$/;
console.log(passwordRegex.test('abc123')); // true
console.log(passwordRegex.test('1abc123')); // false (不以字母开头)
console.log(passwordRegex.test('abc123!')); // false (不以数字结尾)

H2:第三部分:进阶技巧 - 让你的正则更强大

H3:1. 特殊字符与转义

像 , , , , , \, ^, , , , [], 这些在正则中有特殊含义的字符,如果想要匹配它们本身,就需要使用反斜杠 \ 进行转义。

示例: 匹配 5 这个数字,而不是 1 后面跟任意字符和 5

// 错误写法,. 表示任意字符
const wrongRegex = /1.5/; 
console.log(wrongRegex.test('1a5')); // true
// 正确写法,对 . 进行转义
const correctRegex = /1\.5/;
console.log(correctRegex.test('1a5')); // false
console.log(correctRegex.test('1.5')); // true

H3:2. 分组与捕获

使用圆括号 可以将多个元素组合成一个单元,并创建一个捕获组,捕获组允许你从匹配结果中提取出子匹配项。

示例: