FLEX中正则表达式[^0-9]+$的匹配规则及运行异常问题咨询
FLEX正则
[^0-9]+$匹配逻辑与异常现象解答 你对正则[^0-9]+$的语法认知是完全正确的:
[^0-9]匹配任意非数字字符+限定匹配1次及以上$锚定匹配位置为行尾
你观察到的所有异常现象都来自FLEX本身的工作机制,与正则语法本身无关,具体解释如下:
异常现象原因
1. 未匹配内容回显
FLEX的默认行为是:所有没有被规则命中的输入字符,会直接原样输出到标准输出。比如输入111\n整行未命中你的规则,就会直接回显111加换行。
2. 部分内容被丢弃
规则命中的输入内容,FLEX不会自动输出,输出逻辑完全由规则对应的动作决定。你的规则动作只有printf("not a number"),没有打印匹配到的原始内容yytext,所以命中的那部分非数字字符就相当于被「吃掉」,看起来像被丢弃了。
3. 匹配内容同时回显和输出提示
当输入内容分为「未匹配前缀+匹配后缀」时,前缀会触发默认回显,后缀触发你的规则输出提示。比如输入2321a\n,前缀2321未匹配被回显,后缀a命中规则输出not a number,最终输出为2321not a number,看起来就像匹配内容被同时回显了。
4. 仅匹配部分内容
你的规则仅匹配行末尾连续的非数字字符,不是匹配整个符合「以非数字结尾」的整行。比如输入1b1b\n,只有行末尾的b会被规则命中,前面的1b1不会被匹配,就会出现仅匹配部分内容的情况。
修正方案
如果需要匹配整行以非数字结尾的输入,可以调整规则如下:
%option noyywrap %{ #include<stdio.h> %} %% /* 匹配整行以非数字结尾,打印原始内容加提示 */ .*[^0-9]\n { printf("匹配成功:%snot a number\n", yytext); } /* 匹配整行纯数字,打印原始内容 */ [0-9]+\n { printf("匹配纯数字:%s", yytext); } /* 可选:默认规则吃掉所有未匹配内容,取消默认回显 */ . ; \n ; %% int main() { yylex(); return 0; }
内容的提问来源于stack exchange,提问作者user11541813
相关产品推荐
相关产品推荐

