用jFlex标记时间戳并处理ISO格式



我正在尝试解决各种日期格式的日期标记化问题,其中一个可能是ISO8601格式,使用'T'作为分隔符。我希望能够知道字符'T'是一个时间戳,当它的前后有一个数字。

例如,如果我有一个数组

String[] timestamp = {"Time: 12/45/60", "2015-07-13T05:30:59"}

我想要一个分裂的结果

(Time) (:) (12) (/) (45) (/) (60) 
(2015) (-) (07) (-) (13) (T) (05) (:) (30) (:) (59)

我使用jFlex来制作标记器,我这样写我的.flex文件:

    %%
    %class Lexer
    SpecialT = (dTd)
    Parameter = [:jletterdigit:]+
    Delimiter = [^A-Za-z0-9]|{SpecialT}
    %%
    [:digit:]+ {return new Datetoken(yytext(), "Int");}
    {Delimiter} {return new Datetoken(yytext(), "Delimiter");}
    {Parameter} {return new Datetoken(yytext(), "Text");}

但是,这个标记器只能解析符号,而不能解析'T'。有人有什么建议吗?非常感谢。

它适合我,或者更确切地说,它适合语法描述事物。

<!-- language: lang-none -->
7-29T08:42
[Int] 7
[Delimiter] -
[Text] 29T08
[Delimiter] :
[Int] 42
[Delimiter] 

实际上,在扫描器匹配-分隔符

之后
  • 它得到2,匹配[:digit:]+,和{Parameter}
  • 得到9,它匹配[:digit:]+,和{Parameter}
  • 它得到T,它不匹配[:digit:]+,但仍然匹配{Parameter}
  • 08保持匹配{Parameter}
  • :不匹配{Parameter};并返回令牌{Parameter} 29T08

注意,如果你只输入{SpecialT}, {SpecialT}会被识别:

<!-- language: lang-none -->
5T6
[Delimiter] 5T6

你的第一个问题是SpecialT捕获了太多。

第二个问题是{Parameter}几乎匹配所有内容。

我建议您更准确地定义ISO日期:

// HH:MM or HH:MM:ss
IsoTime = {Dig2} {Delimiter} {Dig2} ({Delimiter} {Dig2})?
// yyyy-mm-dd or yyyy-mm-ddT<isotime>
IsoDate =  {Dig4} ({Delimiter} {Dig2}){2} (T {IsoTime})?

这将创建一个完整的2015-07-29T16:42的漂亮标记。

相关内容

  • 没有找到相关文章

最新更新