heavenm 发表于 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]+我写的好像不对

afan 发表于 2019-12-31 23:08:52

(?s)List of devices attached\v+(.+)

heavenm 发表于 2019-12-31 23:16:31

afan 发表于 2019-12-31 23:08

大神你竟然在,
能分别匹配出N条数据么
这个是一条

heavenm 发表于 2019-12-31 23:17:31

这个是ADB命令输出的已连接手机。

afan 发表于 2019-12-31 23:22:17

heavenm 发表于 2019-12-31 23:16
大神你竟然在,
能分别匹配出N条数据么
这个是一条

我晕 不就下两行么
(?s)List of devices attached\v+(\V+\v+\V+)

heavenm 发表于 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

afan 发表于 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), '其中元素为: ' & $aSRE)
_ArrayDisplay($aSRE, UBound($aSRE))

heavenm 发表于 2019-12-31 23:44:44


是一条啊

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

afan 发表于 2019-12-31 23:47:45

heavenm 发表于 2019-12-31 23:44
是一条啊

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

你不是一段获取两行么? 你这只有一段当然就只获取这两行…

afan 发表于 2019-12-31 23:52:14

如果你是要分开的行那就在结果里再 \V+ 一次。。。

floor6ggg 发表于 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+

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



heavenm 发表于 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

afan 发表于 2020-1-2 17:14:28

heavenm 发表于 2020-1-2 17:10
对正解!!
但是只能匹配两行
我想匹配N行

先捕获全部 1~n 行   (?s)List of devices attached\v+(.+)
再将结果分解为单行   \V+

heavenm 发表于 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, '\V+', 3);拆分成行
        $__deviceCount = UBound($__listDevice) - 1;设备数量

        For $i = 0 To $__deviceCount
                Local $__deviceInfo
                $__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 = _StringRegExpEx($__listDevice[$i], '(?i)^(\S+)')
                        $__deviceInfo = _StringRegExpEx($__listDevice[$i], '(?i)product:(\S+)')
                        $__deviceInfo = _StringRegExpEx($__listDevice[$i], '(?i)model:(\S+)')
                        $__deviceInfo = _StringRegExpEx($__listDevice[$i], '(?i)device:(\S+)')
                        $__deviceInfo = _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
EndFunc   ;==>_StringRegExpEx

floor6ggg 发表于 2020-1-2 22:41:45

本帖最后由 floor6ggg 于 2020-1-2 22:47 编辑

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


页: [1] 2
查看完整版本: 请教个正则问题!排除一段内容向下匹配可以的么