ANTLR4中如何按指定次数重复token,实现日期格式匹配规则?
错误原因
- 分隔符规则缺失:你当前定义的
DATE_SEPARATOR只包含/和,,缺少你需要匹配的-分隔符,导致带-的格式无法识别。 - Fragment规则定义不符合需求:你当前的
DAY/MONTH/YEARfragment同时匹配单字符(d/D、m/M、y/Y)和完整单词(day、Month、year等),但你要匹配的日期格式是dd/mm/yyyy这类单字符重复的模式,不需要匹配完整单词,错误的fragment定义会导致量词匹配逻辑完全偏离预期。 - 量词使用逻辑偏差:你直接对包含多字符匹配的fragment规则使用
{1,2}这类量词,会出现匹配到MonthMonth这类不符合预期的结果,和你要的单字符重复需求完全不符。 - 单引号匹配逻辑冲突:你在
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
相关产品推荐
相关产品推荐

