找回密码
 加入
搜索
查看: 4982|回复: 18

[网络通信] 【已解决,感谢:floor6ggg】求个正则,谢谢各位!

[复制链接]
发表于 2020-1-28 19:45:14 | 显示全部楼层 |阅读模式
本帖最后由 itsky2 于 2020-1-31 17:31 编辑

第一段数据:
Disk  Partitions  Cylinders  Heads  Sectors  Mbytes  Model
  1        3        121601     255      63  953869.8  ST1000DM 003-1SB102 CC63


Partition  Status   Type     Volume Label   Mbytes   System   Usage
C:  1        A    PRIMARY    本地磁盘    255190.2  NTFS/HPFS  27%
D:  2             PRIMARY    本地磁盘    596277.6  NTFS/HPFS  63%
E:  3             PRIMARY    本地磁盘    102400.0  NTFS/HPFS  11%



需求:对第二个表格的除第一行的数据生成一个二维数组,如果不行的话也可以包含


第二段数据:
Disk  Partitions  Cylinders  Heads  Sectors  Mbytes  Model
  1        3        121601     255      63  953869.8  ST1000DM 003-1SB102 CC63
  2        2         3738     255      63   29327.4  SanDisk Ultra USB 3.0 1.00



需求:对表格的除第一行的数据生成一个二维数组,如果不行的话也可以包含


谢谢大家!!!
 楼主| 发表于 2020-1-31 14:20:49 | 显示全部楼层
floor6ggg 发表于 2020-1-31 13:41
手机打字,没办法测试,目测:
将 : '([C-Z]:\s+\d+)\s+([A-Z ])\s+(\S+)\s+(\S+)\s+(\S+)\s+(\S+)\s+( ...

Disk  Partitions  Cylinders  Heads  Sectors  Mbytes  Model
  2        2         3738     255      63   29327.4  SanDisk Ultra USB 3.0 1.00

Partition  Status   Type     Volume Label   Mbytes   System   Usage
H:  1        A    PRIMARY                 25231.4  NTFS/HPFS  86%
     2        H    PRIMARY    EFI           2045.4  FAT16       7%

试了下直接闪退了
发表于 2020-1-28 22:30:23 | 显示全部楼层
本帖最后由 yuantian 于 2020-1-28 23:45 编辑

才疏学浅,
第一段只做成了一维数组了,但是不知道怎么两个内容分开
第一段做出来后,第二段相对来说简单点,不过也有坑。

  • 第一段
    #include <Array.au3>
    
    $Value1 = "Disk  Partitions  Cylinders  Heads  Sectors  Mbytes  Model" & @CRLF _
                    & "  1        3        121601     255      63  953869.8  ST1000DM 003-1SB102 CC63" & @CRLF _
                    & "" & @CRLF _
                    & "" & @CRLF _
                    & "Partition  Status   Type     Volume Label   Mbytes   System   Usage" & @CRLF _
                    & "C:  1        A    PRIMARY    本地磁盘    255190.2  NTFS/HPFS  27%" & @CRLF _
                    & "D:  2             PRIMARY    本地磁盘    596277.6  NTFS/HPFS  63%" & @CRLF _
                    & "E:  3             PRIMARY    本地磁盘    102400.0  NTFS/HPFS  11%"
    
    
    $Array1 = StringRegExp($Value1, "(?m)((?:\S+\s){2}\S+|\w\:\s{1,8}\d+|(?<=\s{8})\s(?=\s{4})|\S+)", 3)
    _ArrayDisplay($Array1,"第一段数据")



    ==================
  • 第二段
    #include <Array.au3>
    
    ;第二段相对来说就比较好说了,但是我还是用的笨方法。
    Local $TmpArray
    $Value2 = "Disk  Partitions  Cylinders  Heads  Sectors  Mbytes  Model" & @CRLF _
                    & "  1        3        121601     255      63  953869.8  ST1000DM 003-1SB102 CC63" & @CRLF _
                    & "  2        2         3738     255      63   29327.4  SanDisk Ultra USB 3.0 1.00"
    
    ;先将数据分组
    $Array2 = StringRegExp($Value2, "(?m)((?:\S+\s){2,8}\S+|\S+)", 3)
    
    ;再将数组分段
    If IsInt(UBound($Array2)/7) Then
            For $a = 0 To UBound($Array2) - 1 Step 7
                    $TmpArray1 = _ArrayExtract($Array2,$a,$a+6)
                    _ArrayTranspose($TmpArray1)
                    Switch  $a
                            Case 0
                                    $TmpArray = $TmpArray1
                                    
                            Case Else
                                    _ArrayAdd ( $TmpArray, $TmpArray1)
                            
                    EndSwitch
            Next
    Else
            Msgbox(0, "", "正则表达式需调整!")
    EndIf
    _ArrayDisplay($TmpArray,"第二段数据")





无奈水平有限,代码笨拙简陋,
只为抛砖引玉,期待有更好地回答。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?加入

×
发表于 2020-1-28 23:09:56 | 显示全部楼层
本帖最后由 floor6ggg 于 2020-1-28 23:22 编辑
yuantian 发表于 2020-1-28 22:30
才疏学浅,
第一段只做成了一维数组了,但是不知道怎么两个内容分开
第一段做出来后,第二段相对来说简单 ...

好强的正则表达式!!赞!!!

我直接搜索了一下论坛发现很多类似的帖子………………然后就……非常猥琐的不动脑筋了……模仿A版的写法,凑个热闹
发表于 2020-1-28 23:11:37 | 显示全部楼层
本帖最后由 floor6ggg 于 2020-1-28 23:40 编辑

第一段:直接复制网页上的内容,可能有空格上的差错…………自行调整
### 友情提示:本脚本由 Au3.REHelper 于 2020/01/28 22:37 自动生成,不保证其正确性,请自行测试 ###
#include <Array.au3>
Local $sSource = _
                'Disk  Partitions  Cylinders  Heads  Sectors  Mbytes  Model' & @CRLF & _
                '  1        3        121601     255      63  953869.8  ST1000DM 003-1SB102 CC63' & @CRLF & @CRLF & @CRLF & _
                'Partition  Status   Type     Volume Label   Mbytes   System   Usage' & @CRLF & _
                'C:  1        A    PRIMARY    本地磁盘    255190.2  NTFS/HPFS  27%' & @CRLF & _
                'D:  2             PRIMARY    本地磁盘    596277.6  NTFS/HPFS  63%' & @CRLF & _
                'E:  3             PRIMARY    本地磁盘    102400.0  NTFS/HPFS  11%'
Local $aSRE = StringRegExp($sSource, '([C-Z]:\s+\d+)\s+([A-Z ])\s+(\S+)\s+(\S+)\s+(\S+)\s+(\S+)\s+(\S+)', 3)
_ArrayDisplay($aSRE, UBound($aSRE))

Dim $aArray_new[UBound($aSRE)/7][7]
For $i = 0 To UBound($aSRE) - 1
        $aArray_new[int($i/7)][mod($i,7)]=$aSRE[$i]
Next
_ArrayDisplay($aArray_new, 'new')

发表于 2020-1-28 23:20:52 | 显示全部楼层
论坛的解法,果然简单粗暴………………

接下来的也类似,换汤不换药…………
### 友情提示:本脚本由 Au3.REHelper 于 2020/01/28 23:19 自动生成,不保证其正确性,请自行测试 ###
#include <Array.au3>
Local $sSource = _
                'Disk  Partitions  Cylinders  Heads  Sectors  Mbytes  Model' & @CRLF & _
                '  1        3        121601     255      63  953869.8  ST1000DM 003-1SB102 CC63' & @CRLF & _
                '  2        2         3738     255      63   29327.4  SanDisk Ultra USB 3.0 1.00'
;~MsgBox(0, '源字符串', $sSource)
Local $aSRE = StringRegExp($sSource, '\s+(\d+)\s+(\d+)\s+(\d+)\s+(\d+)\s+(\S+)\s+(\S+)\s+([^\r\n]+)', 3)
If Not @Error Then MsgBox(0, '匹配数量: ' & UBound($aSRE), '其中[0]元素为: ' & $aSRE[0])
_ArrayDisplay($aSRE, UBound($aSRE))

Dim $aArray_new[UBound($aSRE)/7][7]
For $i = 0 To UBound($aSRE) - 1
        $aArray_new[int($i/7)][mod($i,7)]=$aSRE[$i]
Next
_ArrayDisplay($aArray_new, 'new')

点评

你的这个果然凶残,厉害。  发表于 2020-1-28 23:43
发表于 2020-1-28 23:42:08 | 显示全部楼层
不知道有没有可以一步到位的解法………………期待…………
发表于 2020-1-28 23:47:10 | 显示全部楼层
再翻多了几个帖子,发现………………一模一样????A大的解法

http://www.autoitx.com/thread-30632-1-1.html
 楼主| 发表于 2020-1-29 12:16:30 | 显示全部楼层
本帖最后由 itsky2 于 2020-1-30 10:21 编辑
yuantian 发表于 2020-1-28 22:30
才疏学浅,
第一段只做成了一维数组了,但是不知道怎么两个内容分开
第一段做出来后,第二段相对来说简单 ...
$Value1 = _
                'Disk  Partitions  Cylinders  Heads  Sectors  Mbytes  Model' & @CRLF & _
                '  1        5        60801     255      63  476940.0  ST3500320AS' & @CRLF & _
                "  2        1          487     255      63    3824.0  PNY USB 2.0 FD 4096"


$Data = StringRegExp($Value1, "(?m)^\h+(\d+)\h+(\d+)\h+(\d+)\h+(\d+)\h+(\d+)\h+([\d.]+)\h+(\V+)", 3)
Global $Array[UBound($Data)/7][7]
For $i = 0 To UBound($Data) - 1
        $Array[Floor($i / 7)][Mod($i, 7)] = $Data[$i]
Next
 楼主| 发表于 2020-1-31 10:29:59 | 显示全部楼层
floor6ggg 发表于 2020-1-28 23:11
第一段:直接复制网页上的内容,可能有空格上的差错…………自行调整吧



还有没有盘符,即第一列是空格的情况,能否帮忙修改下?谢谢!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?加入

×
发表于 2020-1-31 13:41:42 | 显示全部楼层
itsky2 发表于 2020-1-31 10:29
还有没有盘符,即第一列是空格的情况,能否帮忙修改下?谢谢!

手机打字,没办法测试,目测:
将 : '([C-Z]:\s+\d+)\s+([A-Z ])\s+(\S+)\s+(\S+)\s+(\S+)\s+(\S+)\s+(\S+)'

更改为: '(.*\s+\d+)\s+([A-Z ])\s+(\S+)\s+(\S+)\s+(\S+)\s+(\S+)\s+(\S+)'

应该是可以的,试试看,
如果不行,把 你runcmd('gdisk.exe')返回结果的字符串贴上来…………
发表于 2020-1-31 16:10:24 | 显示全部楼层
itsky2 发表于 2020-1-31 14:20
Disk  Partitions  Cylinders  Heads  Sectors  Mbytes  Model
  2        2         3738     255      ...
(?m)(^[C-Z:\s]{4,}\d+)\s+([A-Z ])\s+(\S+)\s+(.{3,5})\s+([\.\d]+)\s+(\S+)\s+([^\r\n]+)
发表于 2020-1-31 16:13:18 | 显示全部楼层
本帖最后由 floor6ggg 于 2020-1-31 16:15 编辑

修改原因:
1.盘符 为空值考虑进去了
2.Volume Label  也出现了空值,EFI等,和原来的‘本地磁盘’ 不一致的情况
再试一下,不行的话再修改
 楼主| 发表于 2020-1-31 17:26:13 | 显示全部楼层
floor6ggg 发表于 2020-1-31 16:13
修改原因:
1.盘符 为空值考虑进去了
2.Volume Label  也出现了空值,EFI等,和原来的‘本地磁盘’ 不一 ...

谢谢大神,完美解决了!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?加入

×
发表于 2020-1-31 18:09:23 | 显示全部楼层
itsky2 发表于 2020-1-31 17:26
谢谢大神,完美解决了!

菜鸟一枚,非大神,。。。很高兴恰好会的那点能帮得上你,。。。。
您需要登录后才可以回帖 登录 | 加入

本版积分规则

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

GMT+8, 2024-4-20 06:03 , Processed in 0.082993 second(s), 22 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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