正则表达式贪婪模式关闭

1.案例:
正则表达式

Pattern pattern= Pattern.compile
("^(.*?\\.uid-row-\\d+)(?:\\.uid-|$)");

该正则表达式^(.*?.uid-row-\d+)(?:.uid-|$)用于匹配特定格式的字符串,其核心结构解析如下:

‌整体结构‌

^:匹配字符串起始位置
(.*?.uid-row-\d+):第一个捕获组(贪婪模式关闭)
(?:.uid-|$):非捕获组,匹配.uid-或字符串结尾
‌关键组件详解‌

.*?:懒惰匹配任意字符(直到遇到后续模式)
.uid-row-\d+:匹配字面量.uid-row-后接1个以上数字
(?:…):非捕获分组,仅用于逻辑分组而不存储匹配结果
.uid-|:匹配.uid−或字符串结束符:匹配.uid-或字符串结束符:匹配.uid或字符串结束符
‌典型匹配示例‌

输入"section.uid-row-42.uid-data":
匹配结果:“section.uid-row-42”(捕获组1)
剩余部分.uid-data被非捕获组忽略
输入"panel.uid-row-99":
完整匹配(因符合$结尾条件)
‌设计意图‌
该模式常用于提取含.uid-row-{数字}前缀的字符串片段,并忽略后续可能的.uid-后缀或直接结尾的情况。

2.名词解释:
贪婪模式关闭(非贪婪模式)指正则表达式量词匹配时‌尽可能少地捕获字符‌,与默认的贪婪模式(尽可能多匹配)相反。核心要点如下:

一、运作机制对比
‌贪婪模式(默认)‌

量词 *、+、{} 会匹配‌最长可能字符串‌
示例: a.*b 匹配 axbxb 时捕获整个字符串 axbxb。
‌非贪婪模式(关闭贪婪)‌

在量词后添加 ?(如 ?、+?)强制匹配‌最短可能字符串‌
示例: a.
?b 匹配 axbxb 时仅捕获 axb。
二、关闭贪婪模式的方法
‌方法‌ ‌示例‌ ‌效果‌
量词后加 ? \d+? 代替 \d+ 匹配最少数字(如 “123” → “1”)
全局标志(PHP) 模式结尾加 /U 整个表达式启用非贪婪匹配
三、典型应用场景
‌提取最短片段‌
HTML标签匹配中避免跨标签捕获:

<div>.*?</div>   // 仅匹配单个div,而非嵌套的所有内容:ml-citation{ref="3,6" data="citationList"}

‌精准分割字符串‌

re.split(r'a.+?b', 'a1b_a2b')  # 返回 ['', '_', ''] 而非 ['', '']:ml-citation{ref="2" data="citationList"}

四、核心差异总结
‌模式‌ ‌符号‌ ‌匹配原则‌ ‌示例输入 a1b2b‌
贪婪模式 .* 尽可能多匹配 匹配整个 a1b2b
非贪婪模式 .*? 遇结束符立即停止 首次匹配到 a1b 即停止
⚠️ ‌注意‌:Python、Java等语言默认启用贪婪模式,需显式添加 ? 关闭;PHP可通过 /U 全局关闭。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值