xlcwxl 发表于 2010-9-25 19:39:21

[已解决]不知能否用正则提取这段内容

本帖最后由 xlcwxl 于 2010-9-25 21:18 编辑

查看7z文件中包含的文件和文件夹,用命令可以得到7-Zip 4.65Copyright (c) 1999-2009 Igor Pavlov2009-02-03

列举压缩文件: Soft.7z

算法 = LZMA BCJ2
固实文件 = +
模块数 = 2
物理大小 = 1938946
头部大小 = 276

   日期      时间          属性          源文件          压缩后Name
------------------- ----- ------------ ------------------------------------
2010-02-09 15:37:17 ....A       659116       242830Test.exe
2009-08-17 20:48:39 ....A      1685311      1695840文件夹1\文件夹2\Test.exe
2009-08-17 20:48:39 ....A      1685311               文件夹1\Test.exe
2010-02-19 20:18:48 D....            0            0文件夹1\文件夹2
2010-02-19 20:18:55 D....            0            0文件夹1
------------------- ----- ------------ ------------------------------------
                               4029738      19386703 文件数, 2 文件夹数想要的结果1:

Test.exe
文件夹1\文件夹2\Test.exe
文件夹1\Test.exe


想要的结果2:

文件夹1\文件夹2
文件夹1

目录和可执行文件分开,不知能否用正则实现?谢谢!

afan 发表于 2010-9-25 20:50:04

$Str = _
                '7-Zip 4.65Copyright (c) 1999-2009 Igor Pavlov2009-02-03' & @CRLF & _
                '' & @CRLF & _
                '列举压缩文件: Soft.7z' & @CRLF & _
                '' & @CRLF & _
                '算法 = LZMA BCJ2' & @CRLF & _
                '固实文件 = +' & @CRLF & _
                '模块数 = 2' & @CRLF & _
                '物理大小 = 1938946' & @CRLF & _
                '头部大小 = 276' & @CRLF & _
                '' & @CRLF & _
                '   日期      时间          属性          源文件          压缩后Name' & @CRLF & _
                '------------------- ----- ------------ ------------------------------------' & @CRLF & _
                '2010-02-09 15:37:17 ....A       659116       242830Test.exe' & @CRLF & _
                '2009-08-17 20:48:39 ....A      1685311      1695840文件夹1\文件夹2\Test.exe' & @CRLF & _
                '2009-08-17 20:48:39 ....A      1685311               文件夹1\Test.exe' & @CRLF & _
                '2010-02-19 20:18:48 D....            0            0文件夹1\文件夹2' & @CRLF & _
                '2010-02-19 20:18:55 D....            0            0文件夹1' & @CRLF & _
                '------------------- ----- ------------ ------------------------------------' & @CRLF & _
                '                               4029738      19386703 文件数, 2 文件夹数'
Msgbox(0, '原字符串', $str)

$sR = StringRegExp($str, '(?<=\.{4}A|D\.{4})(?:\h+\d*){2}\h+(.+)', 3)
#include <Array.au3>
_ArrayDisplay($sR, UBound($sR))

afan 发表于 2010-9-25 20:55:04

要分别输出结果也行$Str = _
                '7-Zip 4.65Copyright (c) 1999-2009 Igor Pavlov2009-02-03' & @CRLF & _
                '' & @CRLF & _
                '列举压缩文件: Soft.7z' & @CRLF & _
                '' & @CRLF & _
                '算法 = LZMA BCJ2' & @CRLF & _
                '固实文件 = +' & @CRLF & _
                '模块数 = 2' & @CRLF & _
                '物理大小 = 1938946' & @CRLF & _
                '头部大小 = 276' & @CRLF & _
                '' & @CRLF & _
                '   日期      时间          属性          源文件          压缩后Name' & @CRLF & _
                '------------------- ----- ------------ ------------------------------------' & @CRLF & _
                '2010-02-09 15:37:17 ....A       659116       242830Test.exe' & @CRLF & _
                '2009-08-17 20:48:39 ....A      1685311      1695840文件夹1\文件夹2\Test.exe' & @CRLF & _
                '2009-08-17 20:48:39 ....A      1685311               文件夹1\Test.exe' & @CRLF & _
                '2010-02-19 20:18:48 D....            0            0文件夹1\文件夹2' & @CRLF & _
                '2010-02-19 20:18:55 D....            0            0文件夹1' & @CRLF & _
                '------------------- ----- ------------ ------------------------------------' & @CRLF & _
                '                               4029738      19386703 文件数, 2 文件夹数'

#include <Array.au3>

$sR = StringRegExp($str, '(?<=\.{4}A)(?:\h+\d*){2}\h+(.+)', 3)
_ArrayDisplay($sR, '想要的结果1')

$sR = StringRegExp($str, '(?<=D\.{4})(?:\h+\d*){2}\h+(.+)', 3)
_ArrayDisplay($sR, '想要的结果2')

3mile 发表于 2010-9-25 21:04:16

回复 1# xlcwxl
#include <array.au3>
$Str = _
' 7-Zip65Copyright (c) 1999-2009 Igor Pavlov2009-02-03' & @CRLF & _
'' & @CRLF & _
'' & @CRLF & _
' 列举压缩文件: Soft.7z' & @CRLF & _
'' & @CRLF & _
'' & @CRLF & _
' 算法 = LZMA BCJ2' & @CRLF & _
' 固实文件 = +' & @CRLF & _
' 模块数 = 2' & @CRLF & _
' 物理大小 = 1938946' & @CRLF & _
' 头部大小 = 276' & @CRLF & _
'' & @CRLF & _
'' & @CRLF & _
'    日期      时间          属性          源文件          压缩后Name' & @CRLF & _
' ------------------- ----- ------------ ------------------------------------' & @CRLF & _
' 2010-02-09 15:37:17 ....A       659116       242830Test.exe' & @CRLF & _
' 2009-08-17 20:48:39 ....A      1685311      1695840文件夹1\文件夹2\Test.exe' & @CRLF & _
' 2009-08-17 20:48:39 ....A      1685311               文件夹1\Test.exe' & @CRLF & _
' 2010-02-19 20:18:48 D....            0            0文件夹1\文件夹2' & @CRLF & _
' 2010-02-19 20:18:55 D....            0            0文件夹1' & @CRLF & _
' ------------------- ----- ------------ ------------------------------------' & @CRLF & _
'                              4029738      19386703 文件数, 2 文件夹数' & @CRLF & _
'' & @CRLF & _
'复制代码' & @CRLF & _
''
$Resutl=StringRegExp($Str,'\d{4}-\d{2}-\d{2}\h\d{2}:\d{2}:\d{2}.*\h(\D.*)',3)
_ArrayDisplay($Resutl)

3mile 发表于 2010-9-25 21:09:23

回复 3# afan
碰车了,不好意思,没刷新页面

afan 发表于 2010-9-25 21:20:53

回复 5# 3mile


    热心不怕多,呵呵~

p.s, '\d{4}-\d{2}-\d{2}\h\d{2}:\d{2}:\d{2}.*\h(\D.*)' 可能会对数字开头的文件或文件夹多捕捉个前面的空格

xlcwxl 发表于 2010-9-25 21:27:40

回复 6# afan

非常感谢楼上两位的热心帮忙,正则真是强大,这样的都能完整提取出来,谢谢!

lixiaolong 发表于 2010-9-25 21:43:40

我也来一个,借用afan版主的代码#include <Array.au3>

RunWait(@ComSpec & ' /c "C:\Program Files\7-Zip\7z.exe" l soft.7z>%temp%\a.txt', "", @SW_HIDE)
$Str = FileRead(FileOpen(@TempDir & "\a.txt"))

$sR = StringRegExp($str, '(?<=\.{4}A)(?:\h+\d*){2}\h+(.+)', 3)
_ArrayDisplay($sR, '想要的结果1')

$sR = StringRegExp($str, '(?<=D\.{4})(?:\h+\d*){2}\h+(.+)', 3)
_ArrayDisplay($sR, '想要的结果2')

FileDelete(@TempDir & "\a.txt")
页: [1]
查看完整版本: [已解决]不知能否用正则提取这段内容