怎么用高效的代码提取格式化字符串中的信息
如何用高效的代码提取格式化字符串中的信息
本贴是隔壁帖子的继续,原帖问题解决,但引起我另外的思考,所以新开一贴。
有如下的文本若干行
------------------示例文本开始,不包含本行------------------
f(a bc,甲)=丙
f(a,乙)=戊/222 //123
f(48,丙)=戊
f(2aaaaaaa ,丙)=戊//aaa
f(48,张三)=戊
f(阿3,丁)=乙 //子丑寅卯
f(48,)=李四 //子鼠丑牛
------------------示例文本结束,不包含本行------------------
每一行的格式如下:
f(*1,*2)=*3 //*4
其中//*4可能不存在
我想正确提取*1、*2、*3、*4的内容,放入4个字符缓冲区s1、s2、s3、s4中。
现在参考帖子
http://bbs.****.net/topics/390908304
中的代码,修改成如下的程序:
上面的程序运行后,得到如下的结果:
------------------运行结果开始,不包含本行------------------
[[a bc],[甲],[丙],[]
[a],[乙],[戊],[]
[48],[丙],[戊],[]
[2aaaaaaa ],[丙],[戊],[aaa]
[48],[张三],[戊],[aaa]
[阿3],[丁],[乙 ],[子丑寅卯]
in.txt line 7 format error:f(48,)=李四 //子鼠丑牛
------------------运行结果结束,不包含本行------------------
我发现第二行数据提取出来的s3和s4不对:
s3应该是“戊/222 ”
s4应该是“123”
其他各行的数据提取结果都没问题。
请问如何修改程序能让第二行数据也正确提取?
------解决思路----------------------
这个已经超越scanf的阉割正则语法的能力了。请自行处理或使用正规正则库。
------解决思路----------------------
http://www.cnblogs.com/hjslovewcl/articles/2314311.html
http://blog.sina.com.cn/s/blog_5357c0af0100hfua.html
------解决思路----------------------
本贴是隔壁帖子的继续,原帖问题解决,但引起我另外的思考,所以新开一贴。
有如下的文本若干行
------------------示例文本开始,不包含本行------------------
f(a bc,甲)=丙
f(a,乙)=戊/222 //123
f(48,丙)=戊
f(2aaaaaaa ,丙)=戊//aaa
f(48,张三)=戊
f(阿3,丁)=乙 //子丑寅卯
f(48,)=李四 //子鼠丑牛
------------------示例文本结束,不包含本行------------------
每一行的格式如下:
f(*1,*2)=*3 //*4
其中//*4可能不存在
我想正确提取*1、*2、*3、*4的内容,放入4个字符缓冲区s1、s2、s3、s4中。
现在参考帖子
http://bbs.****.net/topics/390908304
中的代码,修改成如下的程序:
#include <stdio.h>
FILE *f;
char ln[80];
char s1[40];
char s2[40];
char s3[40];
char s4[40];
int i;
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[^)])=%39[^/\n]//%[^\n]",s1,s2,s3,s4))
{
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],[乙],[戊],[]
[48],[丙],[戊],[]
[2aaaaaaa ],[丙],[戊],[aaa]
[48],[张三],[戊],[aaa]
[阿3],[丁],[乙 ],[子丑寅卯]
in.txt line 7 format error:f(48,)=李四 //子鼠丑牛
------------------运行结果结束,不包含本行------------------
我发现第二行数据提取出来的s3和s4不对:
s3应该是“戊/222 ”
s4应该是“123”
其他各行的数据提取结果都没问题。
请问如何修改程序能让第二行数据也正确提取?
------解决思路----------------------
这个已经超越scanf的阉割正则语法的能力了。请自行处理或使用正规正则库。
------解决思路----------------------
http://www.cnblogs.com/hjslovewcl/articles/2314311.html
http://blog.sina.com.cn/s/blog_5357c0af0100hfua.html
------解决思路----------------------
//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,)=李四 //子鼠丑牛
//