找回密码
 加入
搜索
查看: 37097|回复: 95

[效率算法] [正则练习]找出所有含有关键字的行及其所属的字段名

 火... [复制链接]
发表于 2011-12-21 14:08:32 | 显示全部楼层 |阅读模式
本帖最后由 afan 于 2011-12-22 18:31 编辑

字符串为读取的一个ini文件(见附件, 这里下载不会扣除金钱),但该文件非ANSI格式,且大于32767个字符,因此,不要考虑用Au3内置的Ini*函数处理,而使用字符串函数,推荐正则。
要求:
找到所有 字段中在关键字或值中含有“□A”或“○A”或“△A”字符串的行 及其所属的字段名。
为了突出字符,特意使用了比较醒目的“■□○△”,但其实际可以为任意非换行字符。
注意:“■”是为了在结果中醒目才使用的这个字符的(并且在■后加上了数字序号,便于查验),它与要搜索的字符没有必然联系。所以“■”不能出现在表达式中,否则没有练习的意义~

以下贴出部分字符示例:
[ir字■3eGy.]
MLlShehZ1JNq = esSngTmouo
7YxmJutp*erqW = nw字F2ljDw
8tQvYx = wmLwq+Nzp
ODFa_Dn-v = i3B*PCKE*字M/A.HEWg字qKLP5VsfO/ci.L3vD8V,tqbHoA7
WtuVxoSe.\e\HAWHu* = -aO1BZDcNOJN*ssr-_7t\j
wnWhhOMn*iSG\6 = gqW字QTrXv9KyxhvTbMWLYkPLEyu汉b6
Ga?8△Agg = B3XPJSdfLw6Mb0n*S3JsE_J2Ox6+iUN汉8i-ayC
ayd汉jacN字7 = uYG6,CTC6dEho汉K8PhbpH9u,0\g
MqtMv*0RgAF = .dtKN/Tl8qIToR1i7SF1j5W 0tDMcWjNQpIR
LuJNEyp_,N91n?1GN57N = f1△AQWMwmu314uOHqEC0-UfErltq_Gq_oqG
vJ+J?-S2m1CGd6 = jZIZfJDE+u+*0G92/3zRHWO\pxmi+CPQi
CE01WwZu? = lRUNPvE_Q汉49a?WvnMV8pH?E*VUoowKnkzm,?D
g?MEOlxMCht,YvL2x = y7eRtS4b7?0S?.kll6R7tYyn.1oACNj+
h_o6abhQh = xAm7I-xcKm
AIn_ = /6Eb7dp0*Vuzt\iW?zn-bp7+swHR0-daz+.y_cb8IR9bZ.5P4RJ
VK字K5*nq4 = d4o,S_8y.,oov15+-5M7OqWUHI
SClBqn_OyPMTigXsB = S0aI3V7yn4SP5q?a字NJEO/ibwW2,fhms1
T字.\q?F = 78P6QhW\-4t5FG7e
H/EgJHGybSRnNtE9?Rh0  = gRr7汉7ARGbJ*n汉B/INV7
urOLO = VeEXLKP1h9汉FmyG80wR4
GzTd字9K5Ts0j27e5g40y = ?qU5u?.pNL9-BSwOGN-LE*9vRtfFGTr汉,QsvVZ1d*xftDOw
6/zrJs_.A5z = f,\BTA*t8mAYOdAsglAO.
6yCG = Ezo 2YREfhy\aKlZUuDbFcc\TA2ZfKjwu\bI
MWGxqq9T = /6ZOY3h3cX4dSK汉-Ey?r4kz
1DNRT?uCoTy = q3QUdkBfe80CItk_NcfOmq9++
3861BPjD*n-FipA = f-Nzxuj 0/F.IMzAN4qZi
FZRGFl\+/UHddh = bqy字71字/oAlv 4DM6BdFpr6.dQ汉7J字7yWO1X SG_dn
*j5Wh = hO-XE9xn字JM2.字-ePGPyx4MyhT3
RycXYvl汉BI = T*p9XANj6l2Z8/,\LCok92OuTj3bAZ1J6cB
3.7VgI?M = 2R2hZ_mxtMq字wSCbS_kS\idq3Nxt
7LmtSk-FUftJqj2ul qh = T/x\rbzfztHYi\ViAK\CZ汉l_8istKs7xNM\v\stBu/,S-GLD
vrYO7 = 汉xEP7Dk?LRe6MP,IYk\3*-h-91x/N
QGvHvkB xuuH = FG0gXr9o/-V+co35wcee6r0DADsVC,iPCpG
+uf1汉B1V59oWQFWt?F = K.Li1字iMmosxXX9RSEOolcgwnX4/9H
2MlLeSsaS汉kaJ2+ = soTDke2O-dYYL+yc0tGzvCCLmHDKxp3n4gdrcN3v*iHnYMT0VZ
XW4Ky4g5E_zXZR3qzOTC = G,ckr汉5z\NN8X0uGF字xNV+VLkovxjtz23qfZhqbAdm9/8CbQ
xGp9n = -BUVrzL/acGY1 JeMhqaoIuDc汉dtRp/4TvBWPqK*bT1,
RlVb+AJm字IGXW6_ = 字xoS8J7
?I7tk+w\Go*K77r-H = x0eMYT?汉obzBQ
hgl38VyG汉V = i-87mj?x1
m9_F字5H3○A = b?LGE_?cVUvVMUHQ-uYOfV0eSYre8rU?


以上示例需要的结果如下(数组元素或字符串均可):

ir字■3eGy.
Ga?8△Agg = B3XPJSdfLw6Mb0n*S3JsE_J2Ox6+iUN汉8i-ayC

LuJNEyp_,N91n?1GN57N = f1△AQWMwmu314uOHqEC0-UfErltq_Gq_oqG

m9_F字5H3○A = b?LGE_?cVUvVMUHQ-uYOfV0eSYre8rU?


读取附件的字符串需得到的结果如下:


当然,如果没有空行(数组空元素)则更好~
尽量一次正则处理,当然,觉得比较困难的可以分步处理。
也欢迎非正则的处理答案~


为了不影响他人思维,答案请隐藏。
由于字符串较长,为了不影响浏览,答题时请不要直接贴出源字符串,而使用 $str = FileRead('Test_Ini.ini') 代替。


我的题解:
游客,如果您要查看本帖隐藏内容请回复

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?加入

×
发表于 2011-12-21 14:13:40 | 显示全部楼层
先支持一个, 坐个沙发.
慢慢再思考下, 也不知做得来不?就会一丁点正则...
 楼主| 发表于 2011-12-21 14:15:16 | 显示全部楼层
先支持一个, 坐个沙发.
慢慢再思考下, 也不知做得来不?就会一丁点正则...
user3000 发表于 2011-12-21 14:13



    我也只会一点正则,能搞出来就行~
发表于 2011-12-21 15:02:45 | 显示全部楼层
本帖最后由 kevinch 于 2011-12-22 00:51 编辑

游客,如果您要查看本帖隐藏内容请回复
不知道对没?
发表于 2011-12-21 15:10:38 | 显示全部楼层
本帖最后由 binghc 于 2011-12-21 15:13 编辑





其实很简单:

游客,如果您要查看本帖隐藏内容请回复

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?加入

×

评分

参与人数 1金钱 +80 收起 理由
afan + 80 没有空行,呵呵,学习了

查看全部评分

发表于 2011-12-21 15:17:46 | 显示全部楼层
看了A版及另两位兄弟的回复, 我发觉自己说错话了...
其实我还不会正则...
 楼主| 发表于 2011-12-21 15:22:15 | 显示全部楼层
其实很简单:

**** 本内容被作者隐藏 ****
binghc 发表于 2011-12-21 15:10



    没有空行,呵呵,学习了~
不过,貌似效率还可以加强~
发表于 2011-12-21 16:17:48 | 显示全部楼层
回复 8# afan


    的确!
发表于 2011-12-21 17:29:03 | 显示全部楼层
本帖最后由 大绯狼 于 2011-12-21 17:37 编辑

我也来玩玩
[au3]
$s=StringRegExp(FileRead(@DesktopDir&"\Test_Ini.ini"),'(?m)^(?=.*[■□○△]A.*$)([^=\s]*)\s*=\s*(\S*)',3)
For $i=0 To UBound($s)-1 Step 2
        ConsoleWrite($s[$i]&@TAB&$s[$i+1]&@CRLF)
Next
[/au3]

评分

参与人数 1金钱 +20 收起 理由
afan + 20 加油整~

查看全部评分

发表于 2011-12-21 18:04:55 | 显示全部楼层
我也来玩玩
大绯狼 发表于 2011-12-21 17:29



    你这个得到结果少了很多...比我做的又多了两条...哈哈
 楼主| 发表于 2011-12-21 18:22:33 | 显示全部楼层
并非表达式越精简执行越有效率,较多的“肯定”部分反而效率更高。

评分

参与人数 1金钱 +20 收起 理由
komaau3 + 20

查看全部评分

发表于 2011-12-21 18:54:35 | 显示全部楼层
回复 12# afan


    你的ini文件还太小,要真正体现效率的还得应用在较大文本下才能看出效率差异。

把你的ini文本复制N份让文件变得大些,这是个办法
 楼主| 发表于 2011-12-21 19:01:52 | 显示全部楼层
回复  afan


    你的ini文件还太小,要真正体现效率的还得应用在较大文本下才能看出效率差异。

把 ...
binghc 发表于 2011-12-21 18:54


这个可以自己加嘛~ 不过,因为没到0.00x 毫秒的执行时间级别,已经足够体现效率。
目前你在6#的代码在我这耗时为 104 ms,测试文本就算小个几倍都能体现效率~
发表于 2011-12-21 19:16:55 | 显示全部楼层
回复 14# afan

我的机子上测试也是100来ms,稍微改一下效率提升3倍多30ms左右;

游客,如果您要查看本帖隐藏内容请回复

评分

参与人数 2金钱 +10 贡献 +5 收起 理由
cashiba + 10
afan + 5 学习了~

查看全部评分

 楼主| 发表于 2011-12-21 19:31:42 | 显示全部楼层
回复  afan

我的机子上测试也是100来ms,稍微改一下效率提升3倍多30ms左右;

**** 本内容被作者隐藏 ...
binghc 发表于 2011-12-21 19:16



    你的这条测试在我这为 26 ms左右,我在一楼的代码在我这 8.5 ms 左右。
您需要登录后才可以回帖 登录 | 加入

本版积分规则

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

GMT+8, 2024-4-27 09:39 , Processed in 0.090023 second(s), 27 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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