kxing 发表于 2012-12-19 07:18:39

请教正则提取ini字段的键和值

本帖最后由 kxing 于 2012-12-19 07:19 编辑

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

比如:

123=abc
234=bcd
345=cdf

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

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

感谢回答!!

annybaby 发表于 2012-12-19 08:36:12

回复 1# kxing


    这么复杂的正则表达式都写出来了,却不知道ini那几个现成的函数??

netegg 发表于 2012-12-19 09:18:44

本帖最后由 netegg 于 2012-12-19 09:20 编辑

回复 1# kxing
这个是不是有些吃饱了找事呀,ini文件的项值和项数据又没有具体限制,正则怎么配出来,如果单单是例子里那三行估计倒是不难
简单说个情况,比如:


1 = 'http://www.autoitx.com/forum.php?mod=redirect&tid=36631&goto=lastpost#lastpost'

kxing 发表于 2012-12-19 09:39:29

现在就是要做一个操作数据版的ini函数。
我感觉标准的ini是可以用正则提取的。
除非afan告诉我正则不行,否则不相信。

annybaby 发表于 2012-12-19 09:58:47

回复 4# kxing


    #include'array.au3'
$data=''&@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=''&@crlf& _
      '123=abc'&@crlf& _
      '234=bcd'&@crlf& _
      '345=cdf'


$a=stringregexp($data,"(?m)(.+?)=(\V+)",3)
_ArrayDisplay($a)套用一下annybaby大牛 的代码,更改一下!哈哈

annybaby 发表于 2012-12-19 10:18:09

回复 6# 小影

其实我上面也是按楼主的意思随手写一个可以显示楼主要求的值而已,当然会很不严谨,至少后面不应该用单词来捕获,因为还有可能是其它的,用"(?m).+=([^\s]+)"可能会好一点,其实很明显,这问题把正则这样用并不是一个好主意,还有N多更好的方法,只不过楼主既然如此固执,那我自然不好说更多了~~

小影 发表于 2012-12-19 10:24:46

回复 7# annybaby
是呀。。针对INI文件都有专门的操作函数,用正则实在不是最好的方法!

annybaby 发表于 2012-12-19 11:14:13

回复 8# 小影

不是指这个,因为楼主说要操作内存的数据,其实可以用如数组,字典等办法,因为用正则匹配或者字符串拆分出来也不方便引用和标记(缺少或难以找到保险的对应关系,容易出错),之前,楼主说正则效率低,被A大回了一帖,现在又另开一帖,非要正则不可,呵呵~~想来都好笑~~

netegg 发表于 2012-12-19 11:54:51

回复 4# kxing
不是不行,是没有通用方法,情况不同需要不同的正则

netegg 发表于 2012-12-19 12:14:45


DWORD WINAPI GetPrivateProfileString(
_In_   LPCTSTR lpAppName,
_In_   LPCTSTR lpKeyName,
_In_   LPCTSTR lpDefault,
_Out_LPTSTR lpReturnedString,
_In_   DWORD nSize,
_In_   LPCTSTR lpFileName
);
api原型

kxing 发表于 2012-12-19 12:31:10

本帖最后由 kxing 于 2012-12-19 12:44 编辑

回复 9# annybaby

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

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

另外也可用sqlite数据库,但是似乎这数据库没的加密保存。

kxing 发表于 2012-12-19 12:34:15

回复 11# netegg

这也是要提供文件路径的,不是数据呢

kxing 发表于 2012-12-19 12:38:01

回复 6# 小影

你这个只能提取所有字段的键值,而不是指定字段下的键值。

netegg 发表于 2012-12-19 13:08:57

本帖最后由 netegg 于 2012-12-19 13:17 编辑

回复 14# kxing
跟你说了,不同的文件格式有不同的构造方式,你怎么单用数据写出来,即使二进制也要还原
另外,谁说sqlite没加密功能的,最简单的数据加密,加密后存进去就完了,不考虑效率的话
还有,官网讨论过sqlite加密的事,自己去找吧
再说一个,ini不能加密,难道不能使用权限吗,比加密还可靠
说实话,加密文本类文件就是没事找事干,想解密就解密,所有的密文都是明码,一个个算法试呗,只是时间而已
页: [1] 2
查看完整版本: 请教正则提取ini字段的键和值