正则表达式中的选择和分支(Alternation)
选择(Alternation)是正则表达式中实现“或”逻辑的核心机制,使用竖线|来分隔多个备选模式。匹配时,正则引擎会从左到右尝试每个分支,一旦某个分支成功匹配,就停止尝试。
这让正则能同时匹配多种不同的模式,非常适合处理多格式输入、可选变体等场景。
1. 基本语法:|(分支操作符)
| 语法 | 描述 | 示例 | 匹配说明 |
|---|---|---|---|
| `a | b` | 匹配 a 或 b | `/cat |
| `^a | b$` | 结合锚点限制位置 | `/^cat |
|的优先级很低,几乎最低(仅高于量词后的修饰符),它会作用于整个模式的两侧。- 因此,通常需要用括号
()来明确分支范围。
2. 结合分组控制分支范围
| 示例 | 说明 |
|---|---|
| `/(cat | dog)/` |
| `/^(cat | dog)$/i` |
| `/(https? | ftp)😕//` |
| `/^(19 | 20)\d{2}$/` |
3. 多分支与优先级(从左到右)
正则引擎按分支顺序尝试,左边的优先。
| 示例 | 匹配结果 |
|---|---|
| `/cat | dog |
| `/dog | cat/` 匹配 “cat” |
最佳实践:将更具体、更常见的模式放在左边,提高效率和准确性。
示例:
/^(jpeg|jpg|png|gif|webp)$/i优先匹配 “jpeg” 而不是让 “jpg” 抢走 “jpeg” 的前三个字符。
4. 复杂分支示例
| 场景 | 正则表达式 | 说明 |
|---|---|---|
| 匹配多种日期格式 | `/^\d{4}-\d{2}-\d{2}$ | ^\d{2}/\d{2}/\d{4}$ |
| 匹配邮箱提供商 | `/@(gmail.com | yahoo.com |
| 匹配颜色值 | `/^#([A-Fa-f0-9]{6} | [A-Fa-f0-9]{3})$/` |
| 匹配手机号(多种前缀) | `/^1(3 | 4 |
5. 分支与量词的结合
量词作用于紧邻的模式,分支时需注意分组:
| 示例 | 正确匹配 | 错误理解 |
|---|---|---|
| `/a(bc | de)+f/` | “abcdebcdef” 等 |
| `/abc | def+/` | “abc” 或 “defff” |
| `/(ab)+ | (cd)+/` | “abab” 或 “cdcd” |
6. 实际应用场景
| 场景 | 正则示例 | 用途 |
|---|---|---|
| 验证多种图片格式 | `/.(jpe?g | png |
| 匹配美式/英式拼写 | `/color | colour/i` |
| 解析日志级别 | `/^(ERROR | WARN |
| 匹配 IPv4 地址(简化版) | `/^((\d{1,2} | 1\d{2} |
| 去除多种空白 | `/\s+ |
7. 注意事项
性能:分支过多或过长可能导致回溯过多,影响性能。尽量将公共部分提取到分支外。
示例优化:
坏:/apple|application|apply/
好:/appl(e|ication|y)/捕获组:如果你需要捕获分支匹配的内容,使用捕获组
(cat|dog);如果不需要,用非捕获组(?:cat|dog)提高性能和清晰度。空分支:
/a|/可以匹配 “a” 或空字符串(某些引擎允许),需谨慎。
选择和分支是正则表达式实现“多路匹配”的核心,结合分组、量词和锚点,能处理非常复杂的模式变体。掌握它后,你能轻松应对现实中多种格式并存的文本处理需求!
如果你有具体格式需要匹配(如多种时间格式、日志解析等),欢迎提供例子,我可以帮你设计最优正则。