我正在尝试解决各种日期格式的日期标记化问题,其中一个可能是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} - 则
0
和8
保持匹配{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的漂亮标记。