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

ANTLR4中如何按指定次数重复token,实现日期格式匹配规则?

错误原因

  1. 分隔符规则缺失:你当前定义的DATE_SEPARATOR只包含/和,,缺少你需要匹配的-分隔符,导致带-的格式无法识别。
  2. Fragment规则定义不符合需求:你当前的DAY/MONTH/YEAR fragment同时匹配单字符(d/D、m/M、y/Y)和完整单词(day、Month、year等),但你要匹配的日期格式是dd/mm/yyyy这类单字符重复的模式,不需要匹配完整单词,错误的fragment定义会导致量词匹配逻辑完全偏离预期。
  3. 量词使用逻辑偏差:你直接对包含多字符匹配的fragment规则使用{1,2}这类量词,会出现匹配到MonthMonth这类不符合预期的结果,和你要的单字符重复需求完全不符。
  4. 单引号匹配逻辑冲突:你在FORMATE规则开头匹配了单引号,但是结尾没有匹配,同时又单独定义了SINGLE_QUOTE规则匹配单引号,逻辑不统一会触发词法边界识别错误。

修正方案

调整后的Lexer规则如下:

// 日期分隔符新增-,覆盖你需要的所有分隔符类型
fragment DATE_SEPARATOR: [/,\\-];

// 调整fragment为仅匹配单字符,适配d/m/y重复的格式需求
fragment D: [dD];
fragment M: [mM];
fragment Y: [yY];

// 统一在FORMATE规则中匹配前后单引号,不需要额外单独匹配结尾单引号
FORMATE
: '\'' 
  ( M{1,2} DATE_SEPARATOR? D{1,2} DATE_SEPARATOR? Y{1,4}  // 匹配mmddyyyy、mm/dd/yyyy类格式
  | D{1,2} DATE_SEPARATOR? M{1,2} DATE_SEPARATOR? Y{1,4}  // 匹配ddmmyyyy、dd/mm/yyyy、dd-mm-yyyy类格式
  | Y{1,4} DATE_SEPARATOR? M{1,2} DATE_SEPARATOR? D{1,2}  // 匹配yyyymmdd类格式
  )
  '\''
;

// 若其他场景需要用到独立单引号可保留该规则,必须放在FORMATE规则之后避免优先级冲突
SINGLE_QUOTE: '\'';

额外注意事项

  • 如果你的场景确实需要支持day/month/year这类单词写法的格式描述,可以单独新增对应的分支规则,不要和单字符重复的规则混写在同一个fragment里。
  • ANTLR4 Lexer规则的优先级是从上到下匹配的,FORMATE规则要放在SINGLE_QUOTE、标识符这类通用规则之前,避免部分字符被提前识别为其他token,导致FORMATE无法匹配完整内容。

内容的提问来源于stack exchange,提问作者Rama Ranneh

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 18:06:03