你了解正则表达式中“?”的作用吗?

正则表达式中 ? 主要有两种核心用法,一种是基础的量词用法,另一种是高级的非贪婪匹配/特殊修饰用法,下面详细拆解说明:

一、 基础用法:量词 - 匹配前面的元素「0次或1次」(可选匹配)

这是 ? 最基础、最常用的功能,它作为量词,作用于紧邻其左侧的单个正则元素(可以是单个字符、字符类、分组等),表示该元素是可选的------既可以出现1次,也可以不出现(0次),最终匹配结果二选一。

示例说明
  1. 匹配可选字符:比如匹配 "color"(美式拼写)和 "colour"(英式拼写)
    正则表达式:colou?r
    解析:u? 表示字母 u 可选(出现0次或1次),因此能同时匹配 "color"(u出现0次)和 "colour"(u出现1次)。
  2. 匹配可选分组:比如匹配 "手机号"(带区号或不带区号,假设区号是 +86
    正则表达式:(\\+86 )?1[3-9]\\d{9}
    解析:(\\+86 )? 表示整个分组 +86 可选,能匹配 "13800138000"(无区号)和 "+86 13800138000"(有区号)。

二、 高级用法:修饰量词 - 开启「非贪婪匹配」(惰性匹配)

? 紧跟在其他量词(*+{n,}{n,m} 等)之后时,它的作用不再是量词,而是将该量词的默认「贪婪匹配」模式切换为「非贪婪匹配」(也叫惰性匹配)。

核心区别
  • 贪婪匹配(默认):量词会尽可能匹配最多的字符,直到无法满足正则后续条件为止。
  • 非贪婪匹配(? 修饰后):量词会尽可能匹配最少的字符,只要满足正则后续条件就立即停止。
示例说明

以字符串 <div>内容1</div><div>内容2</div> 为例,对比两种匹配模式:

  1. 贪婪匹配(默认,无 ?
    正则表达式:<div>.*</div>
    匹配结果:会一次性匹配整个字符串 <div>内容1</div><div>内容2</div>
    解析:.* 是贪婪匹配,会尽可能匹配最多的字符,直到找到最后一个 </div> 才停止。
  2. 非贪婪匹配(加 ? 修饰)
    正则表达式:<div>.*?</div>
    匹配结果:会分别匹配两个片段 <div>内容1</div><div>内容2</div>
    解析:.*? 是非贪婪匹配,只要找到第一个 </div> 就停止当前匹配,然后继续匹配下一个符合条件的片段。

补充:其他特殊场景(非核心,了解即可)

在部分正则引擎中(如Python的re模块、JavaScript正则),? 还会用于特殊语法的前缀标识,例如:

  • (?i):忽略大小写匹配(修饰符)
  • (?P<name>...):命名分组(Python专属)
  • (?:...):非捕获分组(仅匹配,不保留分组结果)
    这些场景中 ? 是语法标识,不具备上述两种核心功能,需结合具体语法使用。

总结

  1. ? 作为量词 :匹配左侧紧邻元素 0 次或 1 次(实现可选匹配),如 colou?r
  2. ? 作为量词修饰符 :紧跟 */+/{n,} 等量词后,将贪婪匹配转为非贪婪匹配,如 .*?
  3. 额外场景:部分正则引擎中作为特殊语法前缀(如忽略大小写、命名分组等)。
相关推荐
qq_317620318 小时前
第09章-标准库与常用模块
正则表达式·标准库·collections模块·数据序列化·时间处理
玄同7652 天前
Python 异常捕获与处理:从基础语法到工程化实践的万字深度指南
开发语言·人工智能·python·自然语言处理·正则表达式·nlp·知识图谱
zhuzhihongNO12 天前
Java正则表达式持续更新
正则表达式·pattern.dotall·正则表达式贪婪模式·正则表达式惰性模式·java正则表达式
玄同7653 天前
Python 正则表达式:LLM 噪声语料的精准清洗
人工智能·python·自然语言处理·正则表达式·nlp·知识图谱·rag
white-persist3 天前
【内网运维】Netsh 全体系 + Windows 系统专属命令行指令大全
运维·数据结构·windows·python·算法·安全·正则表达式
k***92164 天前
[C++][正则表达式]常用C++正则表达式用法
开发语言·c++·正则表达式
白日做梦Q4 天前
【MySQL】9.吃透关键SQL语法:从正则表达式、窗口函数、条件函数到结果集合并的实战拆解
数据库·sql·mysql·正则表达式
快点好好学习吧4 天前
PHP程序员到底为什么要学习正则表达式?使用场景是什么?底层原理是什么?
学习·正则表达式·php