502762378 发表于 2012-9-17 00:20:32

请教各位一个正则算法[已解决]

本帖最后由 502762378 于 2012-9-17 12:44 编辑

最近写了一个处理数据量很大的脚本,始终觉得效率低下,其中一段数据有这样的规则:
1234:

    1234:    1
       

    234:   c:\1.txt
       
    3451:    3
       
    3456:    good good study
          day day up
                       
    4567:    6
          
demo中的数据全部是瞎搞的,每俩有数据的行中间夹着一到两行不等的空白行,第一行冒号后空白,想要得到每行字符窜冒号后边除去空白符的数组也就是包含'1'、'c:\1.txt'、 '3'、'good good study'&@crlf&'day day up'(这厮有两行或者多行,难倒我的地方)、'6'的数组,惭愧自己不会正则,特此请教,谢谢各位了!

鉴于举出例子的模糊性,上一条标准的数据,其实是在搞文件服务器的审计,希望可以说明问题,谢谢打开的对象:

        对象服务器:        Security

        对象类型:        File

        对象名称:        C:\LOREN\abc.txt

        句柄 ID:        1956

        操作 ID:        {0,486852256}

        进程 ID:        3388

        图像文件名:        C:\WINDOWS\explorer.exe

        主要用户名:        E000923

        主要域:        XXXX-WH

        主要登录 ID:        (0x0,0x278363)

        客户端用户名:        E000923

        客户端域:        XXXX-WH

        客户端登录 ID:        (0x0,0x278363)

        访问次数:        (0x0,0x278363)

        特权:        WRITE_OWNER
                WriteAttributes


        受限 Sid 计数:         SeTakeOwnershipPrivilege

        访问掩码:        0

drunk 发表于 2012-9-17 10:41:58

stringregexp($str, ":\s*(\w+)[\s\S]*?:\s*(+:\\[^\r\n]+)\b[\s\S]*?:\s*(\w+)[\s\S]+:\s*([\s\S]+?)\b\s*[^\s]+:\s*(\w+)", 4)

不知道这个行不,不行的话请帖长点!

love5173 发表于 2012-9-17 10:54:02

回复 1# 502762378 #include <Array.au3>
$file="D:\UserFile\Desktop\11111.txt"
$txt=FileRead($file)&@CRLF&"1234:"
MsgBox(0,0,$txt)
$array=StringRegExp($txt,'(?s)\d+:(.+?)(?=\d+:)',3)
_ArrayDisplay($array)

502762378 发表于 2012-9-17 11:15:45

回复 2# drunk


   可能我举得例子有问题,谢谢您的热心,更新了下数据,希望可以继续得到您的帮助

502762378 发表于 2012-9-17 11:17:20

回复 3# love5173


    是我例子的问题,已重新上传,谢谢关注,好久没见你在提问区溜达了

love5173 发表于 2012-9-17 12:12:57

回复 5# 502762378 #include <Array.au3>
$file="D:\UserFile\Desktop\11111.txt"
$txt=FileRead($file)&@CRLF&"一:"
MsgBox(0,0,$txt)
$array=StringRegExp($txt,'(?s)[一-龥]+\s*\w*:(.+?)(?=[一-龥]+)',3)
_ArrayDisplay($array)因为这种匹配有局限性,你给的匹配是没问题的,就怕有特殊情况。如果有可以给我留言 我继续改进

502762378 发表于 2012-9-17 12:40:59

回复 6# love5173


    搞定,many thanks

shqf 发表于 2012-9-17 13:15:45

哈,等我想出方法,已经解决了。看来我花的时间太长了。#include <Array.au3>
$file=@ScriptDir & "\test.txt"
$txt=FileRead($file)&@CRLF&@CRLF
MsgBox(0,0,$txt)
$array=StringRegExp($txt,': {8}(.+\n.*\n)',3)
_ArrayDisplay($array)[

502762378 发表于 2012-9-17 16:18:28

回复 6# love5173


    测试出个BUG,当我提供的数据中第七行中路径名称出现空格时,将得不到完整路径

love5173 发表于 2012-9-18 16:51:17

回复 9# 502762378
我不知道你说的空格是什么意思,我自己加了空格也没什么不妥
你最好能把出问题的那段文字发一份看看
说实话这正则写成这样就是因为你的那段要求有换行的部分造成的,要不能简单的多

502762378 发表于 2012-9-18 18:59:37

回复 10# love5173
打开的对象:

        对象服务器:        Security

        对象类型:        File

        对象名称:        C:\LOREN\复件 复件 复件 456.txt

        句柄 ID:        1956

        操作 ID:        {0,486852256}

        进程 ID:        3388

        图像文件名:        C:\WINDOWS\explorer.exe

        主要用户名:        E000923

        主要域:        XXXX-WH

        主要登录 ID:        (0x0,0x278363)

        客户端用户名:        E000923

        客户端域:        XXXX-WH

        客户端登录 ID:        (0x0,0x278363)

        访问次数:        (0x0,0x278363)

        特权:        WRITE_OWNER
                                 READ_CONTROL
                                 ReadData (或 ListDirectory)
                                 ReadEA
                       

        受限 Sid 计数:         SeTakeOwnershipPrivilege

        访问掩码:        0

比如说这个,你的正则对象名称只能得到“C:\LOREN”,而特权也不会得到全部,真的非常感激。

love5173 发表于 2012-9-18 19:49:05

回复 11# 502762378

好吧 我说了 我写的东西很多都是针对情况来的,尽量简化了代码
这样就没什么问题了#include <Array.au3>
$file="D:\UserFile\Desktop\11111.txt"
$txt=FileRead($file)&@CRLF&"一:"
MsgBox(0,0,$txt)
$array=StringRegExp($txt,'(?s)[一-龥]+\s*\w*?:(.+?)(?=[一-龥]+\s*\w*?:)',3)
_ArrayDisplay($array)

502762378 发表于 2012-9-20 17:24:56

回复 12# love5173


    实在是不好意思,但是还是要说一下,得到的文件路径没有空格。。

shqf 发表于 2012-9-22 13:10:38

没试过我的代码吗?我的代码可没这个问题啊。伤心¥%#@!……
页: [1]
查看完整版本: 请教各位一个正则算法[已解决]