如何调整正则使前置捕获组不匹配数字前的season前缀且兼容多season场景?
正则调整方案
问题根源
原正则采用零宽正向预查(?<=season )做位置校验,这类零宽规则不会实际消耗匹配流中的字符,导致前面的贪婪匹配片段(.*)可以毫无阻碍地将最后一个作为分隔标记的season文本纳入自身捕获范围,最终媒体名的捕获结果会带上冗余的season内容。
调整后的正则
^(movie|tv) (.*) season ([0-9 ]+)
实现逻辑
- 删掉原有的零宽预查结构,把分隔用的
season(空格+season+空格)作为实际需要消耗的匹配片段直接写入正则,这部分内容不归属任何捕获组,从根源上避免被前面的(.*)吞噬。 - 保留
.*的默认贪婪匹配特性:正则引擎处理贪婪量词时,会先尽可能多占据字符,再逐步回溯调整直到整个规则完整匹配,因此会自动定位到字符串末尾附近最后一个能和后续season ([0-9 ]+)匹配的位置,精准停在最后一个作为分隔标记的season前面。 - 整个规则没有在
(.*)中加入排除“season”关键词的限制,完全符合补充约束要求。
场景验证
- 常规场景输入
tv game of thrones season 1 2 3,捕获结果为:
tv game of thrones 1 2 3
和预期完全一致。
2. 媒体名含season的约束场景输入tv game of season season 1 2 3,捕获结果为:
tv game of season 1 2 3
不会因为媒体名本身包含season文本出现匹配错位。
内容的提问来源于stack exchange,提问作者Slim Shady
相关产品推荐
相关产品推荐

