找回密码
 加入
搜索
查看: 6168|回复: 21

[AU3基础] 请教个正则问题!排除一段内容向下匹配可以的么

  [复制链接]
发表于 2019-12-31 23:05:47 | 显示全部楼层 |阅读模式
List of devices attached
WGY7N17113003852       unauthorized transport_id:2
sasdw2312312 aaaaaaaaaaaaa

目的是,结果里面有List of devices attached
就匹配下面两行数据
(?s)(?#List of devices attached)[^\r]+
我写的好像不对

发表于 2019-12-31 23:08:52 | 显示全部楼层
(?s)List of devices attached\v+(.+)
 楼主| 发表于 2019-12-31 23:16:31 | 显示全部楼层

大神你竟然在,
能分别匹配出N条数据么
这个是一条
 楼主| 发表于 2019-12-31 23:17:31 | 显示全部楼层
这个是ADB命令输出的已连接手机。
发表于 2019-12-31 23:22:17 | 显示全部楼层
heavenm 发表于 2019-12-31 23:16
大神你竟然在,
能分别匹配出N条数据么
这个是一条

我晕 不就下两行么
(?s)List of devices attached\v+(\V+\v+\V+)
 楼主| 发表于 2019-12-31 23:30:53 | 显示全部楼层
afan 发表于 2019-12-31 23:22
我晕 不就下两行么

还是一条结果,这个是两部手机
List of devices attached,有手机连接就输出这个,没手机连接会出现和这条无关的内容
手机1 WGY7N17113003852       unauthorized transport_id:2
手机2 sasdw2312312 aaaaaaaaaaaaa
发表于 2019-12-31 23:35:20 | 显示全部楼层
heavenm 发表于 2019-12-31 23:30
还是一条结果,这个是两部手机
List of devices attached,有手机连接就输出这个,没手机连接会出现和这 ...

我这是多条,不知道你是不是脑壳急着跨年
#include <Array.au3>
Local $sSource = _
                @CRLF & _
                'List of devices attached' & @CRLF & _
                'WGY7N17113003852       unauthorized transport_id:2' & @CRLF & _
                'sasdw2312312 aaaaaaaaaaaaa' & @CRLF & @CRLF & _
                'List of devices attached' & @CRLF & _
                '手机1 WGY7N17113003852       unauthorized transport_id:2' & @CRLF & _
                '手机2 sasdw2312312 aaaaaaaaaaaaa'
;~MsgBox(0, '源字符串', $sSource)
Local $aSRE = StringRegExp($sSource, '(?s)List of devices attached\v+(\V+\v+\V+)', 3)
If Not @Error Then MsgBox(0, '匹配数量: ' & UBound($aSRE), '其中[0]元素为: ' & $aSRE[0])
_ArrayDisplay($aSRE, UBound($aSRE))
 楼主| 发表于 2019-12-31 23:44:44 | 显示全部楼层

是一条啊

我想列表出电脑已连接的手机列表。有时候一台,有时候N台

本帖子中包含更多资源

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

×
发表于 2019-12-31 23:47:45 | 显示全部楼层
heavenm 发表于 2019-12-31 23:44
是一条啊

我想列表出电脑已连接的手机列表。有时候一台,有时候N台

你不是一段获取两行么? 你这只有一段当然就只获取这两行…
发表于 2019-12-31 23:52:14 | 显示全部楼层
如果你是要分开的行那就在结果里再 \V+ 一次。。。
发表于 2020-1-1 22:45:05 | 显示全部楼层
按照我的理解,A大的V+多一次的意思是:
(?s)List of devices attached\v+(\V+\v+)(\V+\v+)
上面的包含回车换行的vertical whitespace character,


如果不需要vertical的话,用下面的:
(?s)List of devices attached\v+(\V+)\v+(\V+)\v+

嗯,应该是这个意思吧……



 楼主| 发表于 2020-1-2 17:10:14 | 显示全部楼层
floor6ggg 发表于 2020-1-1 22:45
按照我的理解,A大的V+多一次的意思是:
上面的包含回车换行的vertical whitespace character,
(?s)List of devices attached\v+(\V+)\v+(\V+)
对正解!!
但是只能匹配两行
我想匹配N行
List of devices attached
WGY7N1711300385A       unauthorized transport_id:2
WGY7N1711300385B       unauthorized transport_id:2
WGY7N1711300385C       unauthorized transport_id:2
........
WGY7N1711300385Z       unauthorized transport_id:2
发表于 2020-1-2 17:14:28 | 显示全部楼层
heavenm 发表于 2020-1-2 17:10
对正解!!
但是只能匹配两行
我想匹配N行

先捕获全部 1~n 行   (?s)List of devices attached\v+(.+)
再将结果分解为单行   \V+
 楼主| 发表于 2020-1-2 17:29:32 | 显示全部楼层
afan 发表于 2020-1-2 17:14
先捕获全部 1~n 行   (?s)List of devices attached\v+(.+)
再将结果分解为单行   \V+

OK,又改进了下,不错!3Q
_devicesAttached()
Func _devicesAttached();连接的设备
        Local $__sqliteDeviceInfo
        $__adbRequest = _adbCommand('devices -l');连接的设备列表
        $__listDevice = StringRegExp($__adbRequest, '(?s)List of devices attached\v+(.+)', 3);拆分成行
        If Not IsArray($__listDevice) Then
                MsgBox(0, '', '无连接的设备!')
                Exit
        EndIf
        $__listDevice = StringRegExp($__listDevice[0], '\V+', 3);拆分成行
        $__deviceCount = UBound($__listDevice) - 1;设备数量

        For $i = 0 To $__deviceCount
                Local $__deviceInfo[9]
                $__serial = _StringRegExpEx($__listDevice[$i], '(?i)^(\S+)')
                _SQLite_QuerySingleRow($TodoDB, 'SELECT * FROM "default" WHERE serial="' & $__serial & '"', $__sqliteDeviceInfo)
                If IsArray($__sqliteDeviceInfo) Then;数据库存在,当前已连接设备信息,则适用数据库信息
                        Assign($__serial, $__sqliteDeviceInfo, 2)
                Else
                        Assign($__serial, $__deviceInfo, 2)
                        $__deviceInfo[0] = _StringRegExpEx($__listDevice[$i], '(?i)^(\S+)')
                        $__deviceInfo[1] = _StringRegExpEx($__listDevice[$i], '(?i)product:(\S+)')
                        $__deviceInfo[2] = _StringRegExpEx($__listDevice[$i], '(?i)model:(\S+)')
                        $__deviceInfo[3] = _StringRegExpEx($__listDevice[$i], '(?i)device:(\S+)')
                        $__deviceInfo[4] = _StringRegExpEx($__listDevice[$i], '(?i)transport_id:(\S+)')
                        $__sqliteCommand = StringFormat('REPLACE INTO "%s"  VALUES ("%s")', 'default', _ArrayToString(Eval($__serial), '","'))
                        _SQLite_Exec($TodoDB, $__sqliteCommand)
                EndIf
        Next
        _ArrayDisplay(Eval($__serial))
EndFunc   ;==>_devicesAttached

Func _StringRegExpEx($__str, $__pattern)
        $__result = StringRegExp($__str, $__pattern, 3)
        If @error Then Return
        Return $__result[0]
EndFunc   ;==>_StringRegExpEx
发表于 2020-1-2 22:41:45 | 显示全部楼层
本帖最后由 floor6ggg 于 2020-1-2 22:47 编辑

采用排除一段内容向下匹配的解法的话,楼主的2次正则完美匹配。。。。仅针对类似以上6行的数据进行处理----非抬杠----针对其特征进行正则提取,也是一种思路。。。
\S{16}\s+.+\v?


本帖子中包含更多资源

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

×
您需要登录后才可以回帖 登录 | 加入

本版积分规则

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

GMT+8, 2024-11-16 08:21 , Processed in 0.082598 second(s), 20 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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