user-0 提问: 如何用高效的代码提取格式化字符串中的信息

回复:
user: user-1
content: LEX+YACC Flex+Bison

user: user-0
content: 引用 13 楼 ForestDB 的回复:我最近在看一本书，叫《叫flex和bison》，当然我也看不太懂，但是可以推荐给你。 挺好，中英文版的pdf在csdn上都找到了，有空好好读读。

user: user-2
content: 我最近在看一本书，叫《叫flex和bison》，当然我也看不太懂，但是可以推荐给你。

user: user-0
content: 引用 6 楼 ForestDB 的回复:最高效的就是状态机。 请问ForestDB兄，状态机用程序实现起来能否数据与程序分离。 也就算是，我负责设计状态机，按程序员要求的格式将状态机描述出来，程序员负责编程运行状态机。 当我的状态机变换的时候，程序不用任何修改就能运行另一个符合格式要求的状态机。

user: user-0
content: 赵哥 给的程序不错，开了眼界。我见过有一种有限状态转移网络，跟有限状态机很像，那是只转移状态不输出的，能识别字符串，但不能提取字符串中的信息。

user: user-0
content: 引用 5 楼 zhao4zhong1 的回复:提醒坛友们：      在字符串扫描处理这个问题域内，正则表达式不是万能的；而有限状态自动机是万能的。   我对有限状态自动机稍懂一点，我觉得它只能识别一个字符串是否符合给定的格式，不知道它是不是还有从字符串中提取需要数据的功能？

user: user-0
content: 引用 4 楼 zhao4zhong1 的回复:建议楼主节省下以后思考此类问题的时间，潜心研究《编译原理》中的词法分析和有限状态自动机。 谢谢赵哥的代码。编译原理的有限状态自动机稍微懂一点，但词法分析没学过。

user: user-0
content: 引用 2 楼 xpdavis 的回复:http://www.cnblogs.com/hjslovewcl/articles/2314311.html http://blog.sina.com.cn/s/blog_5357c0af0100hfua.html 好资料，以后好好学习学习。

user: user-1
content: 引用 9 楼 woshihuzi 的回复:[quote=引用 5 楼 zhao4zhong1 的回复:] 提醒坛友们：      在字符串扫描处理这个问题域内，正则表达式不是万能的；而有限状态自动机是万能的。   我对有限状态自动机稍懂一点，我觉得它只能识别一个字符串是否符合给定的格式，不知道它是不是还有从字符串中提取需要数据的功能？[/quote] 有限状态机，（英语：finite-state machine, FSM），又称有限状态自动机，简称状态机，是表示有限个状态以及在这些状态之间的转移和动作等行为的数学模型。 参考下面：//有字符串 //1_22_333,,4444__55555,_666666 //需要解析为 //1 //22 //333 //_ //4444 //55555 //666666 #include <stdio.h> char s[]="1_22_333,,4444__55555,_666666"; char c,*p,*p1; int st; void main() {     st=0;     p=s;     while (1) {         c=*p;         if (0==c) {             switch (st) {             case 1:printf("_\n");    break;             case 2:printf("%s\n",p1);break;             }             break;//         }         switch (st) {         case 0:                  if ('_'==c) {                            st=0;}             else if (','==c) {                            st=1;}             else             {p1=p;                       st=2;}         break;         case 1:                  if ('_'==c) {                            st=1;}             else if (','==c) {printf("_\n");              st=1;}             else             {p1=p;                       st=2;}         break;         case 2:                  if ('_'==c) {*p=0;printf("%s\n",p1);*p=c;st=0;}             else if (','==c) {*p=0;printf("%s\n",p1);*p=c;st=1;}             else             {                            st=2;}         break;         }         p++;     } } //1 //22 //333 //_ //4444 //55555 //666666

user: user-2
content: 最高效的就是状态机。

user: user-1
content: 提醒坛友们：      在字符串扫描处理这个问题域内，正则表达式不是万能的；而有限状态自动机是万能的。

user: user-1
content: 建议楼主节省下以后思考此类问题的时间，潜心研究《编译原理》中的词法分析和有限状态自动机。

user: user-1
content: //in.txt //f(a  bc,甲)=丙 //f(a,乙)=戊/222    //123 //f(48,丙)=戊 //f(2aaaaaaa   ,丙)=戊//aaa //f(48,张三)=戊 //f(阿3,丁)=乙    //子丑寅卯 //f(48,)=李四  //子鼠丑牛 #include <stdio.h> #include <stdlib.h> #include <string.h> FILE *f; char ln[80]; char s1[40]; char s2[40]; char s34[80]; char *p; char s3[40]; char s4[40]; int i,k; int main() {     f=fopen("in.txt","r");     if (NULL==f) {         printf("Can not open file in.txt!\n");         return 1;     }     i=0;     while (fgets(ln,80,f)) {         if (3==sscanf(ln,"f(%39[^,],%39[^)])=%79[^\n]",s1,s2,s34)) {             p=strstr(s34,"//");             if (p) {                 k=__min(39,p-s34);                 strncpy(s3,s34,k);s3[k]=0;                 k=__min(39,strlen(p+2));                 strncpy(s4,p+2,k);s4[k]=0;             } else {                 strncpy(s3,s34,39);s3[39]=0;                 s4[0]=0;             }             printf("[%s],[%s],[%s],[%s]\n",s1,s2,s3,s4);         } else {             printf("in.txt line %d format error:%s",i+1,ln);         }         i++;     }     fclose(f);     return 0; } //[a  bc],[甲],[丙],[] //[a],[乙],[戊/222    ],[123] //[48],[丙],[戊],[] //[2aaaaaaa   ],[丙],[戊],[aaa] //[48],[张三],[戊],[] //[阿3],[丁],[乙    ],[子丑寅卯] //in.txt line 7 format error:f(48,)=李四  //子鼠丑牛 //

user: user-3
content: http://www.cnblogs.com/hjslovewcl/articles/2314311.html http://blog.sina.com.cn/s/blog_5357c0af0100hfua.html

user: user-4
content: 这个已经超越scanf的阉割正则语法的能力了。请自行处理或使用正规正则库。