正则表达式如何分组捕获最后一串数字及其之前的全部内容?
问题原因
你当前用的.*是正则默认的贪婪匹配模式,会尽可能匹配最长的字符串,只会给后面的\d+留最少满足匹配要求的1个数字,因此才会出现Frame分组只抓到最后1位3的问题。
解决方法
调整正则,确保Frame分组捕获的是最后一段连续数字即可,推荐两种可靠写法:
写法1(兼容性更高,兼容字符串开头就是数字的场景)
(?P<Sequence>.*\D)?(?P<Frame>\d+)(?!.*\d)
原理是通过\D限制Sequence分组的结尾必须是非数字,避免它吞掉Frame分组的前缀数字,末尾加?是为了兼容字符串开头就是数字的极端场景(比如0023.jpg这种没有前置非数字内容的情况,此时Sequence分组值为空,Frame分组值为0023)。
写法2(逻辑更直观)
(?P<Sequence>.*?)(?P<Frame>\d+)(?=\D*$)
原理是将.*改为非贪婪模式.*?,同时通过正向先行断言(?=\D*$)明确要求Frame分组匹配的数字之后,全是非数字字符直到字符串结尾,确保Frame抓的是最后一段连续数字。
匹配验证
针对你的示例字符串see.Ya23.v2.0023.jpg,两种写法的捕获结果都符合预期:
- Sequence分组:
see.Ya23.v2. - Frame分组:
0023
内容的提问来源于stack exchange,提问作者Diying
相关产品推荐
相关产品推荐

