当前位置: 首页 > news >正文

正则表达式,`[]`(字符类)和`|`(或操作符)

在正则表达式中,[](字符类)和|(或操作符)都用于表示“或”的关系,但它们的用法和语义有本质区别:

一、字符类 []

作用

匹配方括号内任意一个字符,只能匹配单个字符。

语法规则
  1. 普通字符:直接列出需要匹配的字符。
    • 例如:[abc] 匹配 abc 中的任意一个字符。
  2. 范围表示:使用连字符 - 表示字符范围。
    • 例如:[0-9] 匹配任意数字,[a-zA-Z] 匹配任意字母。
  3. 否定:在方括号内以 ^ 开头,表示匹配不在方括号内的字符。
    • 例如:[^0-9] 匹配任意非数字字符。
示例
  • [aeiou]:匹配任意元音字母。
  • [0-9a-fA-F]:匹配十六进制数字(0-9、a-f、A-F)。
  • [^ ]:匹配任意非空格字符。

二、或操作符 |

作用

匹配多个子表达式中的任意一个,可以匹配多个字符组成的字符串。

语法规则
  1. 分隔子表达式:用 | 分隔多个子表达式,表示“或”关系。
    • 例如:cat|dog 匹配 catdog
  2. 优先级| 的优先级较低,通常需要用括号 () 明确分组。
    • 例如:a(b|c) 匹配 abac,而不是 bc
示例
  • (Mr|Mrs|Ms)\.:匹配 Mr.Mrs.Ms.
  • \d{3}-\d{4}|\+\d{1,3}\s\d{10}:匹配 123-4567 格式的电话号码,或 +86 1234567890 格式的国际号码。

三、关键区别对比

| 特性 | 字符类 [] | 或操作符 | |
|------------------------|-------------------------------------|--------------------------------------|
| 匹配单位 | 单个字符 | 整个子表达式(可以是多个字符) |
| 示例 | [abc] 匹配 a, b, 或 c | abc|def 匹配 abcdef |
| 否定形式 | [^...] 表示取反 | 无直接否定形式,需用 (?!...) 零宽断言 |
| 常用场景 | 字符级的多选(如密码强度检查) | 字符串级的多选(如匹配不同单词) |
| 性能 | 通常更快(直接索引字符集) | 较慢(需依次尝试多个子表达式) |

四、常见误区

  1. 错误混用

    • 错误:[cat|dog] (期望匹配 catdog
    • 正确:(cat|dog)cat|dog| 分隔完整子表达式)
  2. 过度使用 |

    • 错误:a|b|c|d (匹配单个字符时效率低)
    • 正确:[abcd] (字符类更高效)

五、正则表达式示例

1. 验证邮箱域名
(qq|gmail|outlook)\.com  # 匹配 qq.com、gmail.com 或 outlook.com
2. 匹配HTML标签
<(div|p|h[1-6])>  # 匹配 <div>、<p> 或 <h1>~<h6>
3. 匹配日期格式
\d{4}(-|/)\d{2}(-|/)\d{2}  # 匹配 2023-06-26 或 2023/06/26

六、性能注意事项

  • 字符类 [] 的匹配速度通常快于 |,因为它直接检查字符是否在预定义集合中。
  • 或操作符 | 可能导致回溯(backtracking),尤其是子表达式较长时。例如:(abc|def|ghi)+ 可能在匹配失败时多次尝试不同分支。

在需要高效匹配单个字符的多选情况时,优先使用字符类 []

http://www.lqws.cn/news/529399.html

相关文章:

  • MFC制作动态波形图( ChartCtrl)
  • 【AI News | 20250626】每日AI进展
  • ​​Deepoc大模型在光电研发中的核心技术突破与应用​
  • 使用CSS泄露标签属性值 url路径遍历攻击 -- GPN CTF 2025 PAINting Dice
  • CSS 背景属性用于定义HTML元素的背景
  • 构思的股票交易模拟 3D 虚拟主题游戏《股海逐梦 3D》
  • c++17标准std::filesystem常用函数
  • HDFS(Hadoop分布式文件系统)总结
  • 面试破局:告别流水账,用“故事思维”重塑自我介绍
  • 【RESTful接口设计规范全解析】URL路径设计 + 动词名词区分 + 状态码 + 返回值结构 + 最佳实践 + 新手常见误区汇总
  • Word 中批量转换 LaTeX 公式为标准数学格式的终极方法(附宏设置教程)
  • 高弹性、高可靠!腾讯云 TDMQ RabbitMQ Serverless 版全新发布
  • DOA-BiLSTM+NSGAII+熵权TOPSIS,附气泡图!,梦境优化算法+深度学习+多目标优化+多属性决策!
  • Java底层原理:深入理解JVM性能调优与监控
  • Java设计模式->责任链模式的介绍
  • 什么是 MQTT?
  • Nordic nRF52832 寄存器级 UARTE 发送实现
  • Android-Layout Inspector使用手册
  • R语言机器学习算法实战系列(二十六)基于tidymodels的XGBoost二分类器全流程实战
  • ubuntu22.04系统kubeadm部署k8s高可用集群
  • 手机屏像素缺陷修复及相关液晶线路激光修复原理
  • 简单使用python
  • Milvus 资源调度系统的核心部分:「查询节点」「资源组」「数据库」
  • gitlab https链接转为ssh链接
  • Docker 网络——AI教你学Docker
  • Vue 2 项目中内嵌 md 文件
  • Windows 下使用 nvm 管理 Node.js 多版本 —— 完整指南
  • 动态规划之01背包问题
  • 互联网医院系统源码解析:如何实现视频问诊、电子处方等核心功能?
  • 焊接与热切割作业证用途有哪些