找回密码
 加入
搜索
查看: 2416|回复: 4

[AU3基础] 提取log日志中一定格式的内容(帮忙改下正则)(已解决)

  [复制链接]
发表于 2011-2-25 14:34:41 | 显示全部楼层 |阅读模式
本帖最后由 dearmb 于 2011-2-27 13:33 编辑

谁能帮我改个正则表达式呀?
以下是Fastcopy拷贝日志,
以前afan帮我写了一个,详细请看一下下面的帖子
http://autoitx.com/thread-21383-1-1.html
但是他帮我写的正则有些漏洞,比如下面的日志,134.52由于无法复制,写的日志格式和标准的不符合
实际提取的出来的为
2011/02/25 11:03:11 <目标>  \\192.168.134.51\d$\EntrySystems\Line10 结果 : (错误文件: 0 / 错误目录: 0)

2011/02/25 11:03:15 <目标>  \\192.168.134.52\d$\EntrySystems\Line10 结果 : (错误文件: 0 / 错误目录: 0)

2011/02/25 11:03:16 <目标>  \\192.168.134.54\d$\EntrySystems\Line10 结果 : (错误文件: 0 / 错误目录: 0)
但实际上,是134.52失败,134.53是成功,提取出来的信息有错误,谁能帮我改下,
这次想把<目标>前的时间去掉,再多提取一行,就是没有错误那一行,<命令>的下一行
谢谢啦
现在用的正则为
$Test = StringRegExpReplace($str, '(?s).+?\nFastCopy.+?开始于\h(\V+)\v+.+?\n(<目标>\V+).+?\n(结果\V+(?:\r\n|$))', '$1 $2 $3')


-------------------------------------------------
FastCopy(ver2.06) 开始于 2011/02/25 11:03:11

<来源>  D:\line\line10
<目标>  \\192.168.134.51\d$\EntrySystems\Line10
<命令> !复制(总是复制/覆盖所有文件)

没有错误

总计读取 = 0.
发表于 2011-2-25 17:22:48 | 显示全部楼层
本帖最后由 lixiaolong 于 2011-2-25 17:26 编辑

回复 1# dearmb

把afan版主的表达式改了一点.
Local $Str = _
                '-------------------------------------------------' & @CRLF & _
                'FastCopy(ver2.06) 开始于 2011/02/25 11:03:11' & @CRLF & @CRLF & _
                '<来源>  D:\line\line10' & @CRLF & _
                '<目标>  \\192.168.134.51\d$\EntrySystems\Line10' & @CRLF & _
                '<命令> !复制(总是复制/覆盖所有文件)' & @CRLF & @CRLF & _
                '没有错误' & @CRLF & @CRLF & _
                '总计读取 = 0.0 MB' & @CRLF & _
                '总计写入 = 0.0 MB' & @CRLF & _
                '总计文件 = 1 (0)' & @CRLF & _
                '总计时间 = 0.08 秒' & @CRLF & _
                '传输速率 = 0.02 MB/秒' & @CRLF & _
                '文件速率 = 12.82 文件/秒' & @CRLF & @CRLF & _
                '结果 : (错误文件: 0 / 错误目录: 0)' & @CRLF & @CRLF & _
                '-------------------------------------------------' & @CRLF & _
                'FastCopy(ver2.06) 开始于 2011/02/25 11:03:15' & @CRLF & @CRLF & _
                '<来源>  D:\line\line10' & @CRLF & _
                '<目标>  \\192.168.134.52\d$\EntrySystems\Line10' & @CRLF & _
                '<命令> !复制(总是复制/覆盖所有文件)' & @CRLF & @CRLF & _
                '初始化错误 (无法分配内存或创建/访问目标目录)' & @CRLF & _
                '-------------------------------------------------' & @CRLF & _
                'FastCopy(ver2.06) 开始于 2011/02/25 11:03:15' & @CRLF & @CRLF & _
                '<来源>  D:\line\line10' & @CRLF & _
                '<目标>  \\192.168.134.53\d$\EntrySystems\Line10' & @CRLF & _
                '<命令> !复制(总是复制/覆盖所有文件)' & @CRLF & @CRLF & _
                '没有错误' & @CRLF & @CRLF & _
                '总计读取 = 0.0 MB' & @CRLF & _
                '总计写入 = 0.0 MB' & @CRLF & _
                '总计文件 = 1 (0)' & @CRLF & _
                '总计时间 = 0.27 秒' & @CRLF & _
                '传输速率 = 0.01 MB/秒' & @CRLF & _
                '文件速率 = 3.77 文件/秒' & @CRLF & @CRLF & _
                '结果 : (错误文件: 0 / 错误目录: 0)' & @CRLF 
MsgBox(0, '原字符串', $Str)
Local $Test = StringRegExpReplace($str, '(?s).+?\nFastCopy.+?(<目标>\V+).+?\n(结果\V+(?:\r\n|$))', '$1 $2')
MsgBox(0, '替换结果', $Test)
 楼主| 发表于 2011-2-25 21:52:57 | 显示全部楼层
本帖最后由 dearmb 于 2011-2-25 21:55 编辑
回复  dearmb

把afan版主的表达式改了一点.
lixiaolong 发表于 2011-2-25 17:22


谢谢,日期是去掉了
但是结果的错误还没有修改
我给出的日志,134.52是失败的,没有拷贝成功的
我想提取出的应该是134.51和134.53成功
现在的正则,提取出来的是134.51和134.52成功
与实际结果不符合,能不能帮我把没有错误这一行也取出来
帮我改两分吧,一份有“没有错误”这一行的,一份没有“没有错误”这一行的,拜托了
发表于 2011-2-25 22:27:46 | 显示全部楼层
本帖最后由 lixiaolong 于 2011-2-25 22:43 编辑

回复 3# dearmb


试试这个吧,都能取出来.
其实我自己还不明白这个表达式的原理,如果谁可以说明这个原理的话,我想请教一下.
Local $Test = StringRegExpReplace($str, '(?s).+?(<目标>\V+).+?(初始化错误\V+(?:\r\n)|结果\V+(?:\r\n))', '$1 $2')
MsgBox(0, '替换结果', $Test)
发表于 2011-2-25 23:13:04 | 显示全部楼层
本帖最后由 lixiaolong 于 2011-2-25 23:26 编辑

现在有点明白了,所以自己写个笔记(4楼的代码)
希望对大家有帮助.
#cs
        使用替换模式.
        表达式 = (?s).+?(<目标>\V+).+?(初始化错误\V+(?:\r\n)|结果\V+(?:\r\n))
        替换 = $1 $2
        ---------------------------------------------------------------------------------------------------------
        (?s) = 匹配任意字符,包括换行
        .+? = 匹配任何的单字符 (除换行以外),  重复1次或更多次,但尽可能少重复
        (...) = 组
        \V+ = 匹配不是垂直白字符的任何字符,  重复1次或更多次
        (?:) = 非捕获组. 仅工作于正常组, 但是不记录数组的匹配字符, 被匹配的文本也不会用作后向引用
        \r\n = 回车,换行
        | = 可以匹配 | 前的字符也可以匹配 | 之后的字符
        
        $1 = $1的内容是 (<目标>\V+) = 第一个组
        $2 = $2的内容是 (初始化错误\V+(?:\r\n)) 或 (结果\V+(?:\r\n)) = 第二个组
        ---------------------------------------------------------------------------------------------------------
#ce
您需要登录后才可以回帖 登录 | 加入

本版积分规则

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

GMT+8, 2024-10-2 14:31 , Processed in 0.086711 second(s), 24 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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