第六章

阅读与编写正则

学会阅读复杂的正则表达式,掌握编写高质量正则的方法和原则。

正则表达式优先级

理解优先级是读懂复杂正则的关键。

优先级从高到低

1
() [] 括号和字符组
2
* + ? n,m次量词 量词
3
^ $ \b \B | 锚点和位置
4
| 分支(或运算)

示例:拆解复杂正则

ab?(c|de*)+|fg
拆解步骤:
由于 | 优先级最低,先分两部分:
1. ab?(c|de*)+
2. fg
拆解第一部分:
• a - 普通字符
• b? - b出现0或1次
• (c|de*)+ - 分组,重复1次或多次
- c 或 d后跟0个或多个e

阅读复杂正则的技巧

1. 从外到内

先看整体结构,再深入细节。

日期精确匹配模式
→ 从 ^ 和 $ 看出是完整匹配
→ 有三个分组,用 - 分隔
→ 每个分组都是数字,长度分别为4、2、2

2. 识别关键模式

记住常用模式,快速识别意图。

数字匹配模式
手机号/ID
\w+@\w+\.\w+
邮箱
日期匹配模式
日期
https?://\w+
URL

3. 使用工具辅助

善用在线工具可视化正则结构。

  • Regulex - 可视化正则树状结构
  • Regex101 - 详细匹配过程解释
  • • 本站的正则测试器

编写正则的平衡法则

💡 核心原则

一个好的正则应该在准确性可读性性能之间取得平衡。

✓ 准确性

匹配预期的目标,不误匹配非目标。

精确数字匹配

✗ 可能匹配超过11位

精确11位数字

✓ 精确匹配11位

✓ 可读性

代码应该让他人(和未来的自己)容易理解。

复杂密码验证正则

✗ 难以理解

用代码逻辑+简单正则

✓ 清晰易懂

✓ 性能

在可接受的时间内完成匹配。

/(.*a)+/

✗ 灾难性回溯

/[^a]*a/

✓ 高效匹配

编写正则的最佳实践

1. 从简单开始

先匹配核心模式,再逐步添加约束。

2. 使用注释(支持的语言)

/ (?# 匹配邮箱)
\w+@\w+\.\w+ /

3. 充分测试

测试正常情况和边界情况。

4. 考虑使用字符串方法

有时简单的字符串方法比正则更高效。

// 不推荐
str.indexOf("?") !== -1
// 推荐
str.includes("?")

🎯 本章要点

✨ 阅读技巧

  • • 理解优先级规则
  • • 从外到内拆解
  • • 识别常用模式
  • • 善用工具辅助

💡 编写原则

  • • 平衡准确性、可读性、性能
  • • 从简单开始逐步完善
  • • 充分测试各种情况
  • • 考虑是否真的需要正则