正则表达式优先级
理解优先级是读懂复杂正则的关键。
优先级从高到低
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
阅读复杂正则的技巧
编写正则的平衡法则
💡 核心原则
一个好的正则应该在准确性、可读性、性能之间取得平衡。
✓ 准确性
匹配预期的目标,不误匹配非目标。
精确数字匹配
✗ 可能匹配超过11位
精确11位数字
✓ 精确匹配11位
✓ 可读性
代码应该让他人(和未来的自己)容易理解。
复杂密码验证正则
✗ 难以理解
用代码逻辑+简单正则
✓ 清晰易懂
✓ 性能
在可接受的时间内完成匹配。
/(.*a)+/
✗ 灾难性回溯
/[^a]*a/
✓ 高效匹配
编写正则的最佳实践
1. 从简单开始
先匹配核心模式,再逐步添加约束。
2. 使用注释(支持的语言)
/
(?# 匹配邮箱)
\w+@\w+\.\w+
/ 3. 充分测试
测试正常情况和边界情况。
4. 考虑使用字符串方法
有时简单的字符串方法比正则更高效。
// 不推荐
str.indexOf("?") !== -1
// 推荐
str.includes("?")
🎯 本章要点
✨ 阅读技巧
- • 理解优先级规则
- • 从外到内拆解
- • 识别常用模式
- • 善用工具辅助
💡 编写原则
- • 平衡准确性、可读性、性能
- • 从简单开始逐步完善
- • 充分测试各种情况
- • 考虑是否真的需要正则