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

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

一、 基础用法:量词 - 匹配前面的元素「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. 额外场景:部分正则引擎中作为特殊语法前缀(如忽略大小写、命名分组等)。
相关推荐
长城20244 天前
HTML5中表单的pattern属性解析
前端·正则表达式·html·html5·pattern·pattern属性·pattern正则表达式
Gss7774 天前
Linux 正则表达式详解(基础 + 扩展 + 实操)
linux·运维·正则表达式
黑客思维者4 天前
正则表达式(九)网络安全:检测SQL注入攻击 + 检测XSS跨站脚本 + 扫描敏感信息泄露 + 匹配暴力破解异常IP
sql·web安全·正则表达式
黎雁·泠崖4 天前
Java常用类核心详解(七):正则表达式 Regex 从入门到实战
java·开发语言·正则表达式
秀儿还能再秀4 天前
正则表达式核心语法 + Python的 re 库中常用方法
python·正则表达式
xcLeigh4 天前
Python入门:Python3 正则表达式全面学习教程
python·学习·正则表达式·教程·python3
数据知道5 天前
MongoDB 正则表达式查询:在 MongoDB 中实现模糊搜索与索引优化陷阱
数据库·mongodb·正则表达式
A懿轩A5 天前
【Java 基础编程】Java 正则表达式实战:Pattern/Matcher、元字符与常用正则,验证与提取必备
java·开发语言·正则表达式
石牌桥网管5 天前
正则表达式:匹配不包含指定字符串的文本
java·javascript·python·正则表达式·go·php