Regex贪婪匹配失败:匹配两行内容时月份捕获组无返回值问题咨询
问题原因
你的正则无法捕获month分组是贪婪匹配导致的:
- 正则中的
.*是贪婪匹配规则,会尽可能多的吞掉字符串内容 - 你将
(?<month>[a-zA-Z]{3})标记为可选分组(后缀加了?),所以.*会直接匹配到年份前的最后一个空格位置,完全跳过可选的month分组,最终month分组没有任何捕获结果。
修复方案
将.*改为非贪婪匹配.*?,同时调整空格的匹配位置,修正后的正则如下:
^\d.*?(?<month>[a-zA-Z]{3}\s)?(?<year>\d{4})$
如果需要单独提取月份(不含末尾空格),可以用这个版本:
^\d.*?(?:(?<month>[a-zA-Z]{3})\s)?(?<year>\d{4})$
修正后效果:
- 匹配第一行时,
month分组为空,year分组捕获到2020 - 匹配第二行时,
month分组捕获到APR,year分组捕获到2021,拼接后即可得到你需要的APR 2021
内容的提问来源于stack exchange,提问作者ABuNeNe
相关产品推荐
相关产品推荐

