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