🔍 正则表达式(Regular Expression)完全入门指南

87 阅读5分钟

🔍 正则表达式(Regular Expression)完全入门指南

正则表达式(Regular Expression,简称 regexregexp)是一种强大的文本处理工具,能够用来 匹配、查找、替换 符合特定规则的字符串。无论是表单验证、日志分析、文本处理,还是代码重构,正则表达式都能大幅提升效率。本文将带你从零开始掌握正则表达式的核心语法和实战技巧。


🌐 什么是正则表达式?

正则表达式是一种 描述字符串模式 的形式化语言。你可以把它看作“字符串的搜索公式”。

🎯 典型应用场景

场景示例
表单验证验证邮箱、手机号、密码强度
文本搜索在代码或日志中查找特定格式的内容
字符串替换批量替换文本中的某些模式
数据提取从一段文本中提取 URL、日期、IP 地址等
路由匹配前端框架(如 Express、Vue Router)中的动态路由

🧩 基本语法:元字符与字符类

正则由 普通字符元字符 组成。元字符具有特殊含义。

1. 常见元字符

元字符含义示例
.匹配任意单个字符(除换行符)a.c → 匹配 abc, a2c
^匹配字符串开头^Hello → 匹配以 "Hello" 开头的字符串
$匹配字符串结尾world$ → 匹配以 "world" 结尾的字符串
*匹配前一个字符 0 次或多次ab*c → 匹配 ac, abc, abbc
+匹配前一个字符 1 次或多次ab+c → 匹配 abc, abbc,但不匹配 ac
?匹配前一个字符 0 次或 1 次https? → 匹配 httphttps
\转义字符,使元字符失去特殊含义\. → 匹配真正的句号 .

2. 字符类(Character Classes)

写法含义示例
[abc]匹配 a、b 或 c 中的任意一个[aeiou] → 匹配任意元音字母
[a-z]匹配 a 到 z 的任意小写字母[0-9] → 匹配任意数字
[^abc]匹配 a、b、c 的字符[^0-9] → 匹配非数字字符
\d匹配任意数字,等价于 [0-9]\d{3} → 匹配 3 位数字
\w匹配字母、数字、下划线,等价于 [a-zA-Z0-9_]\w+ → 匹配一个单词
\s匹配空白字符(空格、制表符、换行)\s+ → 匹配一个或多个空白
\D\W\S分别是 \d\w\s反义\D+ → 匹配非数字字符串

📏 量词(Quantifiers)

用于指定匹配的次数。

量词含义示例
{n}精确匹配 n 次\d{4} → 匹配 4 位数字(如年份)
{n,}至少匹配 n 次\d{2,} → 匹配 2 位或更多数字
{n,m}匹配 n 到 m 次\d{1,3} → 匹配 1-3 位数字(如 IP 段)
*0 次或多次a* → 匹配 "", a, aa
+1 次或多次a+ → 匹配 a, aa,但不匹配 ""
?0 次或 1 次colou?r → 匹配 colorcolour

🧩 分组与捕获

1. 分组 ( )

用括号 () 将多个字符组合成一个单元。

(https?)://([a-zA-Z0-9.-]+)
  • 第一个分组 (https?):匹配 httphttps
  • 第二个分组 ([a-zA-Z0-9.-]+):匹配域名

2. 捕获与引用

分组后可以用 \1, \2 等引用前面的匹配内容。

// 将 "2025-04-05" 替换为 "05/04/2025"
'2025-04-05'.replace(/(\d{4})-(\d{2})-(\d{2})/, '$3/$2/$1')
// 结果:'05/04/2025'

🔍 模式修饰符(Flags)

写在正则末尾,控制匹配行为。

修饰符含义
g全局匹配(查找所有匹配,而非第一个)
i忽略大小写
m多行模式(^$ 匹配每行的开头和结尾)
s单行模式(. 可以匹配换行符)
const text = "Hello world, hello regex";
text.match(/hello/);        // 只匹配第一个
text.match(/hello/g);       // 匹配所有:['hello', 'hello']
text.match(/hello/gi);      // 忽略大小写全局匹配

✅ 实战案例:常用正则表达式

1. 验证邮箱

^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$

2. 验证手机号(中国大陆)

^1[3-9]\d{9}$

3. 验证密码强度(至少8位,含大小写字母、数字、特殊字符)

^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[@$!%*?&])[A-Za-z\d@$!%*?&]{8,}$

4. 提取 URL 中的域名

https?:\/\/(?:[-\w.]++)\/

5. 匹配 IPv4 地址

^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$

💡 在 JavaScript 中使用正则

1. 创建正则对象

// 方式1:字面量
const regex = /hello/g;

// 方式2:构造函数
const regex = new RegExp('hello', 'g');

2. 常用方法

方法说明
regex.test(str)返回 true/false,判断是否匹配
regex.exec(str)返回匹配结果数组(含分组)
str.match(regex)返回所有匹配项
str.replace(regex, replacement)替换匹配内容
str.split(regex)按正则分割字符串
const pattern = /\d+/g;
const str = "Year: 2025, Month: 04";

str.match(pattern);     // ['2025', '04']
str.replace(/\d+/g, 'X'); // "Year: X, Month: X"

🛠️ 正则调试工具推荐

  • RegExrregexr.com(实时测试、解释)
  • Regex101regex101.com(支持多种语言,详细分析)
  • VS Code 插件Better Comments + 正则高亮
  • 浏览器控制台:直接测试 /.test().match()

⚠️ 使用建议与陷阱

建议说明
✅ 先写注释复杂正则建议用 RegExp 构造函数并加注释
✅ 分步测试从小模式开始,逐步扩展
✅ 避免过度复杂能用字符串方法解决的,不用正则
❌ 不要迷信正则HTML 解析、复杂语法分析不适合用正则
❌ 警惕回溯灾难避免 (.*)* 这类可能导致性能崩溃的写法

📚 总结

正则表达式是每个开发者都应掌握的 文本处理利器。虽然初学时可能觉得晦涩,但一旦掌握,你将能:

  • 快速验证用户输入
  • 高效处理日志和文本
  • 批量重构代码
  • 提升自动化脚本能力

💡 学习建议

  1. 从简单模式开始(如 \d+, \w+
  2. 多用在线工具调试
  3. 结合实际项目练习(如表单验证)

🔗 参考资料

📢 你在工作中用过哪些“神级”正则?欢迎在评论区分享!