正则表达式 – 选择和分支

正则表达式中的选择和分支(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” 或空字符串(某些引擎允许),需谨慎。

选择和分支是正则表达式实现“多路匹配”的核心,结合分组、量词和锚点,能处理非常复杂的模式变体。掌握它后,你能轻松应对现实中多种格式并存的文本处理需求!

如果你有具体格式需要匹配(如多种时间格式、日志解析等),欢迎提供例子,我可以帮你设计最优正则。

文章已创建 3511

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

相关文章

开始在上面输入您的搜索词,然后按回车进行搜索。按ESC取消。

返回顶部