You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

JavaScript中匹配关键词附近日期时间的正则表达式丢失日期首位数字问题排查

解决JavaScript正则匹配关键词附近日期时丢失首位数字的问题

问题成因

你遇到的首位数字丢失问题,核心原因在于正则表达式中关键词后面的匹配部分:

(?:.(?!audiência|sessão virtual|até))*

这个子模式是贪婪匹配任意单个字符,只要该字符的后面没有出现audiência、sessão virtual或até。当它遇到两位数日期(比如24)的第一个数字时,由于这个数字后面的第二个数字不在禁止关键词列表中,正则会把第一个数字(2)纳入前面的匹配范围,导致后续的日期捕获组只能拿到剩下的4,最终出现日期首位丢失的情况。

虽然单独测试日期部分的正则([1-2][0-9]|3[0-1]|0?[1-9])功能正常,但整合后前面的贪婪匹配会“抢占”日期的首位数字,破坏了整体匹配逻辑。

解决方案

我们需要修改关键词后的匹配部分,限制它只能匹配非数字字符,同时保留原有的“不越过指定关键词”的逻辑,这样就能确保日期的数字不会被前面的匹配吃掉。调整后的完整正则如下:

(audiência|sessão virtual)(?:\D(?!audiência|sessão virtual|até))*([1-2][0-9]|3[0-1]|0?[1-9])\s*de\s*([^\s]+)\s*de\s*((19|20)?\d\d)(?:,|\s*)*(?:,|\s*)*(?:\S*)?(?:,|\s*)*([01]?[0-9]|2[0-3])(h|:|\s*horas*\s*e\s*|\s*horas*\s*)([0-5]?[0-9])?

关键修改点

把原来的任意字符匹配.替换为非数字匹配\D,这样前面的子模式(?:\D(?!audiência|sessão virtual|até))*会:

  • 只匹配关键词后的非数字内容(比如示例中的em)
  • 遇到数字就停止匹配,确保日期的完整数字(如24)能被后续的日期捕获组正确捕获
  • 同时保留负向前瞻逻辑,避免匹配越过其他audiência、sessão virtual或até关键词

验证效果

用你提供的示例文本测试:

Lorem Ipsum Lorem Ipsum Lorem Ipsum Audiência em 24 de Julho de 2022 às 16:00 horas Lorem Ipsum Lorem Ipsum Lorem Ipsum

调整后的正则会正确捕获完整日期时间字符串24 de Julho de 2022 às 16:00 horas,同时也能正确处理无前置零的日期(如9 de Janeiro de 2021)。

内容的提问来源于stack exchange,提问作者Rafael Tan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.29 18:57:43