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

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

一、 基础用法:量词 - 匹配前面的元素「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. 额外场景:部分正则引擎中作为特殊语法前缀(如忽略大小写、命名分组等)。
相关推荐
计算机安禾11 小时前
【Linux从入门到精通】第27篇:文本处理三剑客(上)——grep 正则表达式实战
linux·运维·正则表达式
zl_dfq6 天前
服务器设计 之 【正则表达式及C++正则库的简介与使用】
正则表达式
RNEA ESIO6 天前
SQL中的REGEXP正则表达式使用指南
数据库·sql·正则表达式
研☆香8 天前
聊一聊js中的正则表达式的应用
前端·javascript·正则表达式
麦芽糖021910 天前
python进阶六 正则表达式
android·python·正则表达式
Watermelo61711 天前
理解 JavaScript 中的“ / ”:路径、资源与目录、nginx配置、请求、转义的那些事
前端·javascript·vue.js·chrome·nginx·正则表达式·seo
睡不着的可乐11 天前
正则表达式
正则表达式
Dxy123931021612 天前
Python 使用正则表达式将多个空格替换为一个空格
开发语言·python·正则表达式
2401_8274999914 天前
python项目实战11-正则表达式基础
python·mysql·正则表达式
互联网散修14 天前
零基础鸿蒙应用开发第三十三节:正则表达式基础与应用
华为·正则表达式·harmonyos