我正在尝试使用the Flex manual中提到的正则表达式(?r-s:pattern)。
以下代码仅在我输入小写字母'a'而不是大写'A'
时起作用%%
[(?i:a)] { printf("color"); }
\n { printf("NEWLINE\n"); return EOL;}
. { printf("Mystery character %s\n", yytext); }
%%
输出
a
colorNEWLINE
A
Mystery character A
NEWLINE
反向也是如此,即如果我将线(?i:a)改为(?i:A),它只将'A'视为有效输入而不是'a'。 如果我删除方括号,即[],它会给出错误
"ex1.lex", line 2: unrecognized rule
如果我附上“(?i:a)”然后它会编译但是在执行之后它总是会进入最后一条规则,即“神秘人物......”
请让我知道如何正确使用它。
答案 0 :(得分:0)
我想我迟到了.. :)无论如何,您使用的是flex
版本,我安装了版本2.5.35
并正确识别上述模式。也许你正在使用旧版本!!!
现在关于括号[
]括号。它有效,因为根据[]
正则表达式规则,它会尝试匹配任何单个(
,?
,i
,:
,a
或)
。这就是为什么a
被识别而不是A
的原因(因为它不在列表中)。
答案 1 :(得分:0)
我阅读本手册的方式,没有方括号的规则应该执行您正在寻找的不区分大小写的匹配 - 我无法解释为什么在编译时出现错误。但您可以通过两种方式之一实现相同的行为。一,您可以枚举字符类中的大写和小写字符:
%%
[Aa] { printf("color"); }
%%
二,您可以在命令行中指定-i
或--case-insensitive
或.l文件中不区分大小写的扫描程序选项:
%%
%option case-insensitive
[a] {printf("color"); }
%%