我有以下匹配时间的正则表达式:
(1[012]|0\d):[0-5]\d[ap]\.m\.
12 小时格式。
我在这个网站上测试了它并确保它有效。
但它在我的 lex 文件中不起作用:
%{
#define DEPARTURES 300
#define FLIGHT_NUMBER 301
#define TIME 302
%}
%option noyywrap
%option yylineno
%%
[A-Z]{2}[0-9]{1,4} {return FLIGHT_NUMBER;}
"(1[012]|0[0-9]):[0-5][0-9][ap]\.m\." { return TIME; }
[\t\r ]+ { /* skip white space */ }
. { fprintf (stderr, "line %d: unrecognized token %c(%x)\n",
yylineno, yytext[0], yytext[0]); }
%%
int main (int argc, char **argv)
{
extern FILE *yyin;
int token;
if (argc != 2) {
fprintf(stderr, "Usage: %s <input file name>\n", argv [0]);
exit (1);
}
yyin = fopen (argv[1], "r");
while ((token = yylex ()) != 0)
printf("%d - %s\n", token, yytext);
fclose (yyin);
exit (0);
}
main 函数接受一个输入文件并打印文件中检测到的所有标记。
目前,输入文件的内容只是“10:19a.m.”。
运行时,文件中的每个字符的输出仅为“无法识别的标记”。
我是 Flex 和 lex 的新手,所以我不确定我写正则表达式的方式是否有错误。我唯一能找到的是它不支持
\d
,但即使用[0-9]
替换它也无济于事。