找回密码
 加入
搜索
楼主: netbean

[效率算法] 文本减肥:正则[已解决]

 火.. [复制链接]
发表于 2011-5-3 13:54:25 | 显示全部楼层
各位大牛们,好坏分享下思路吧,不要解决了问题,大牛一脸成就感,楼主拿着去找上级涨工资,吾等小民对着像乱码的一行行语句发呆...毕竟读别人的语句,有时候比自己写还难,麻烦稍微给点注释
 楼主| 发表于 2011-5-3 17:31:32 | 显示全部楼层
本帖最后由 netbean 于 2011-5-3 19:22 编辑

呵呵,我下了三本书正在学习:
Mastering Regular Expressions(精通正则表达式 第三版)
[正则表达式经典实例].(美)高瓦特斯,(美)利维森
[正则表达式入门经典].(美)瓦特

测试了新代码,速度恢复了,谢谢:
1672/1725/1638ms-原始文本,by easefull v0.2.0 Beta
3461/2900/2663/2660ms-原始文本,by easefull v0.3.0 Beta
1652/1648/1691/1698ms-原始文本,by easefull v0.3.1 Beta

看似杂乱无章的文本在短短一秒多钟瘦身到不足百分之7,深深感受到正则表达式的强大。非常感谢大家帮忙!
发表于 2011-5-3 23:07:58 | 显示全部楼层
学下下 。。。。。。。。。。。。。
 楼主| 发表于 2011-5-4 06:45:31 | 显示全部楼层
初学者来分析下思路,请指正:
最初,面对复杂的格式采用一次匹配,不成功;
easefull用两次匹配,有点小问题;
kevinch用两次匹配+字典,成功了;
love5173用16进制,先替换了所有的\x00空字符,再匹配,成功;
easefull实验二进制替换;
3mile直接把所有的\x00替换了再用两次匹配,提高效率;
love5173替换了\x00,一次匹配,提高了速度;
easefull用二进制+两次匹配,更快了。
(\x00是16进制空字符,为什么要先替换?)
(为什么2进制更快?)
发表于 2011-5-4 12:45:56 | 显示全部楼层
本帖最后由 easefull 于 2011-5-4 12:47 编辑

这贴子里面的难点在于Chr(0x00)这个字符在正则里面的归属问题.
这个字符有几个特性:
1.在记事本里面打开是显示为空格
2.用msgbox显示字符串,遇到这个字符时,会认为字符串已结束.后面的字符将不会显示.这很影响正则的测试.
3.在正则里面,这个字符不属于\s,似乎也不属于\h和\H,所以之前的匹配都是要先把这个替换掉.

而二进制的匹配(其实准确的说应该是2进制读文件,16进制匹配.只是谁来告诉我,为什么读的是二进制,用的却是16进制匹配?)
虽然正则表达式更复杂了,但省略了把这个字符匹配出来了替换的步骤.
现在想想,似乎也可以使用\x0来匹配这个字符,这样子在ASNI读取方式下,应该也可以省掉替换字符串的步骤.

另外,kevinch的字典方式也是一个亮点,膜拜之
 楼主| 发表于 2011-5-4 13:27:45 | 显示全部楼层
发现用记事本打开再保存的文本,与替换空字符的文本,内容、大小一致,看来记事本会自动替换空字符。
发表于 2011-5-4 15:09:46 | 显示全部楼层
对股票比较感兴趣 ,对正则不太懂
您需要登录后才可以回帖 登录 | 加入

本版积分规则

QQ|手机版|小黑屋|AUTOIT CN ( 鲁ICP备19019924号-1 )谷歌 百度

GMT+8, 2024-5-13 16:46 , Processed in 0.083677 second(s), 14 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表