咳咳,这一章节应该是连载编译器的DIY的,可是在做DIY之前先用flex 来练练手,对于后面的理解有帮助作用。
在word 中我经常看到有一个单词统计的功能,那么是怎么来实现的了,当然第一个念头就是遍历整个文本依据换行和空格对字符串进行分析,那么这是可行的。可是能不能简单点了,其实对文本做单词分析,大家都知道怎么做,难得地方可能就是代码的实现了,那么现在如果使用正则表达式来实现的话,那么一切问题就Over 了。
环境:ubuntu(当然装了flex的windows和mac也可以)
原码:
%{ unsigned long chars=0; unsigned long words=0; unsigned long lines=0; %} %% [a-zA-Z]+ {words++;chars+=strlen(yytext);} [a-z\-A-z]+ {words++;chars+=strlen(yytext);} [0-9]+ {words++;chars+=strlen(yytext);} [.|,|\b| |\t|\r] {chars++;} [\n] {lines++;chars++;} %% int main() { char filename[100]; printf("统计一个英文文件中字符、单词、行数。\n"); printf("请输入要计算的文件名:"); scanf("%s",filename); yyin=fopen(filename,"r"); printf("开始进行统计...\n"); printf("未定义的字符:"); yylex(); printf("\n字符数:%ld\n",chars); printf("单词数:%ld\n",words); printf("行数 :%ld\n",lines); return 1; } int yywrap() { return 1; }@H_403_9@
那么解释第一个正则式[a-zA-Z]+ 表示一个或者多个由大小写字母组成的单词
[a-z\-A-z]+ 对于特殊的中间加"-"的单词
[0-9]+ 数字集合
[.|,|\b| |\t|\r] 特殊符号集合
在编写完上述代码之后,那么直接用flex 进行编译,将得到一个.c文件,接着对C文件编译生成二进制代码运行即可。
测试文本:
my name is te-name
%%%
测试结果:
统计一个英文文件中字符、单词、行数。 请输入要计算的文件名:test.txt 开始进行统计... 未定义的字符:%%% 字符数:20 单词数:4 行数 :2
原文链接:/regex/361653.html