请教个正则问题!排除一段内容向下匹配可以的么
List of devices attachedWGY7N17113003852 unauthorized transport_id:2
sasdw2312312 aaaaaaaaaaaaa
目的是,结果里面有List of devices attached
就匹配下面两行数据
(?s)(?#List of devices attached)[^\r]+我写的好像不对
(?s)List of devices attached\v+(.+) afan 发表于 2019-12-31 23:08
大神你竟然在,
能分别匹配出N条数据么
这个是一条 这个是ADB命令输出的已连接手机。 heavenm 发表于 2019-12-31 23:16
大神你竟然在,
能分别匹配出N条数据么
这个是一条
我晕 不就下两行么
(?s)List of devices attached\v+(\V+\v+\V+) afan 发表于 2019-12-31 23:22
我晕 不就下两行么
还是一条结果,这个是两部手机
List of devices attached,有手机连接就输出这个,没手机连接会出现和这条无关的内容
手机1 WGY7N17113003852 unauthorized transport_id:2
手机2 sasdw2312312 aaaaaaaaaaaaa 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))
是一条啊
我想列表出电脑已连接的手机列表。有时候一台,有时候N台
heavenm 发表于 2019-12-31 23:44
是一条啊
我想列表出电脑已连接的手机列表。有时候一台,有时候N台
你不是一段获取两行么? 你这只有一段当然就只获取这两行… 如果你是要分开的行那就在结果里再 \V+ 一次。。。 按照我的理解,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+
嗯,应该是这个意思吧……
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 heavenm 发表于 2020-1-2 17:10
对正解!!
但是只能匹配两行
我想匹配N行
先捕获全部 1~n 行 (?s)List of devices attached\v+(.+)
再将结果分解为单行 \V+ 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:47 编辑
采用排除一段内容向下匹配的解法的话,楼主的2次正则完美匹配。。。。仅针对类似以上6行的数据进行处理----非抬杠----针对其特征进行正则提取,也是一种思路。。。
\S{16}\s+.+\v?
页:
[1]
2