找回密码
 加入
搜索
查看: 6325|回复: 15

[效率算法] 请教正则提取ini字段的键和值

 火.. [复制链接]
发表于 2012-12-19 07:18:39 | 显示全部楼层 |阅读模式
本帖最后由 kxing 于 2012-12-19 07:19 编辑

请问afan等正则高人们如何用正则来读取某字段下所有键和值呢?

比如:
[section]
123=abc
234=bcd
345=cdf

写了个正则只能捕获到一个结果

$a=stringregexp($data,"\[section\](?:\r\n([^=]+)=(.+))+",3)
for $i=0 to ubound($a)-2 step 2
msgbox(0,$a[$i],$a[$i+1])
next

感谢回答!!
发表于 2012-12-19 08:36:12 | 显示全部楼层
回复 1# kxing


    这么复杂的正则表达式都写出来了,却不知道ini那几个现成的函数??
发表于 2012-12-19 09:18:44 | 显示全部楼层
本帖最后由 netegg 于 2012-12-19 09:20 编辑

回复 1# kxing
这个是不是有些吃饱了找事呀,ini文件的项值和项数据又没有具体限制,正则怎么配出来,如果单单是例子里那三行估计倒是不难
简单说个情况,比如:
[au3]
[section]
1 = 'http://www.autoitx.com/forum.php?mod=redirect&tid=36631&goto=lastpost#lastpost'[/au3]
 楼主| 发表于 2012-12-19 09:39:29 | 显示全部楼层
现在就是要做一个操作数据版的ini函数。
我感觉标准的ini是可以用正则提取的。
除非afan告诉我正则不行,否则不相信。
发表于 2012-12-19 09:58:47 | 显示全部楼层
回复 4# kxing


   
#include'array.au3'
$data='[section]'&@crlf& _
        '123=abc'&@crlf& _
        '234=bcd'&@crlf& _
        '345=cdf'


$a=stringregexp($data,"(?m).+=(\w+)",3)
_ArrayDisplay($a)
发表于 2012-12-19 10:02:53 | 显示全部楼层
#include'array.au3'
$data='[section]'&@crlf& _
        '123=abc'&@crlf& _
        '234=bcd'&@crlf& _
        '345=cdf'
 
 
$a=stringregexp($data,"(?m)(.+?)=(\V+)",3)
_ArrayDisplay($a)
套用一下annybaby大牛 的代码,更改一下!哈哈
发表于 2012-12-19 10:18:09 | 显示全部楼层
回复 6# 小影

其实我上面也是按楼主的意思随手写一个可以显示楼主要求的值而已,当然会很不严谨,至少后面不应该用单词来捕获,因为还有可能是其它的,用"(?m).+=([^\s]+)"可能会好一点,其实很明显,这问题把正则这样用并不是一个好主意,还有N多更好的方法,只不过楼主既然如此固执,那我自然不好说更多了~~
发表于 2012-12-19 10:24:46 | 显示全部楼层
回复 7# annybaby
是呀。。针对INI文件都有专门的操作函数,用正则实在不是最好的方法!
发表于 2012-12-19 11:14:13 | 显示全部楼层
回复 8# 小影

不是指这个,因为楼主说要操作内存的数据,其实可以用如数组,字典等办法,因为用正则匹配或者字符串拆分出来也不方便引用和标记(缺少或难以找到保险的对应关系,容易出错),之前,楼主说正则效率低,被A大回了一帖,现在又另开一帖,非要正则不可,呵呵~~想来都好笑~~
发表于 2012-12-19 11:54:51 | 显示全部楼层
回复 4# kxing
不是不行,是没有通用方法,情况不同需要不同的正则
发表于 2012-12-19 12:14:45 | 显示全部楼层
[au3]
DWORD WINAPI GetPrivateProfileString(
  _In_   LPCTSTR lpAppName,
  _In_   LPCTSTR lpKeyName,
  _In_   LPCTSTR lpDefault,
  _Out_  LPTSTR lpReturnedString,
  _In_   DWORD nSize,
  _In_   LPCTSTR lpFileName
);
[/au3]api原型
 楼主| 发表于 2012-12-19 12:31:10 | 显示全部楼层
本帖最后由 kxing 于 2012-12-19 12:44 编辑

回复 9# annybaby

数据是从一个加密后的文本文件读取出来的。
先要解密后供程序读写。数据改变后还得加密写回去文件。
数据包含了分类、子分类、频道等等多层内容。
用数组或多为数组没法区分分类/子分类或频道等不确定的因素。

目前想到的办法是写成标准的ini,加密后储存。
要用的时候读入程序解密后用操作数据形式的ini函数读取。

另外也可用sqlite数据库,但是似乎这数据库没的加密保存。
 楼主| 发表于 2012-12-19 12:34:15 | 显示全部楼层
回复 11# netegg

这也是要提供文件路径的,不是数据呢
 楼主| 发表于 2012-12-19 12:38:01 | 显示全部楼层
回复 6# 小影

你这个只能提取所有字段的键值,而不是指定字段下的键值。
发表于 2012-12-19 13:08:57 | 显示全部楼层
本帖最后由 netegg 于 2012-12-19 13:17 编辑

回复 14# kxing
跟你说了,不同的文件格式有不同的构造方式,你怎么单用数据写出来,即使二进制也要还原
另外,谁说sqlite没加密功能的,最简单的数据加密,加密后存进去就完了,不考虑效率的话
还有,官网讨论过sqlite加密的事,自己去找吧
再说一个,ini不能加密,难道不能使用权限吗,比加密还可靠
说实话,加密文本类文件就是没事找事干,想解密就解密,所有的密文都是明码,一个个算法试呗,只是时间而已
您需要登录后才可以回帖 登录 | 加入

本版积分规则

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

GMT+8, 2024-5-5 08:16 , Processed in 0.082720 second(s), 23 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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