提取log日志中一定格式的内容(帮忙改下正则)(已解决)
本帖最后由 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. 本帖最后由 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) 本帖最后由 dearmb 于 2011-2-25 21:55 编辑
回复dearmb
把afan版主的表达式改了一点.
lixiaolong 发表于 2011-2-25 17:22 http://autoitx.com/images/common/back.gif
谢谢,日期是去掉了
但是结果的错误还没有修改
我给出的日志,134.52是失败的,没有拷贝成功的
我想提取出的应该是134.51和134.53成功
现在的正则,提取出来的是134.51和134.52成功
与实际结果不符合,能不能帮我把没有错误这一行也取出来
帮我改两分吧,一份有“没有错误”这一行的,一份没有“没有错误”这一行的,拜托了 本帖最后由 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) 本帖最后由 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
页:
[1]