如何调整正则表达式,匹配到第一个目标模式后停止?
正则匹配问题:捕获第一个目标数值
问题背景
有如下文本块:
/dev/disk0s2 3.6Ti 2.9Ti 796Gi 79% 383906083 104366287 79% / /dev/disk0s3 1.2Ti 1.3Ti 796Gi 79% 383906083 104366287 79% /
使用正则表达式:
(\/dev\/disk0s2).* (\d*\.\d+)?Ti
期望匹配结果为3.6,但实际匹配到的是2.9。需要调整正则表达式,使其匹配到第一个目标项后停止。
解决方法
原正则里的.*是贪婪匹配,会尽可能匹配最长的字符序列,所以直接跳过第一个3.6Ti,直到最后一个符合格式的2.9Ti才停止匹配。
有两种调整方式:
方式一:精准匹配空白字符
直接用\s+匹配/dev/disk0s2后的空白,精准定位第一个数值:
(\/dev\/disk0s2)\s+(\d*\.\d+)Ti
方式二:改用非贪婪匹配
把.*改成非贪婪模式的.*?,让它遇到第一个符合后续规则的内容就停止匹配:
(\/dev\/disk0s2).*? (\d*\.\d+)Ti
补充说明
- 去掉了原正则里的
?,因为我们明确要捕获带小数点的数值,不需要可选匹配 - 两种方式都能精准捕获到
3.6这个目标值,第一种更高效,因为不需要模糊匹配任意字符
内容的提问来源于stack exchange,提问作者Lacer
相关产品推荐
相关产品推荐

