找回密码
 加入
搜索
查看: 6058|回复: 23

[AU3基础] 正则负向预取?!匹配模式的问题

  [复制链接]
发表于 2018-7-21 11:53:24 | 显示全部楼层 |阅读模式
本帖最后由 heavenm 于 2018-7-21 20:56 编辑

[mw_shl_code=applescript,true]### 友情提示:本脚本由 Au3.REHelper 于 2018/07/21 12:16 自动生成,不保证其正确性,请自行测试 ###
#include <Array.au3>
Local $sSource = _
                'a111111111' & @CRLF & _
                'a22222222' & @CRLF & _
                'asdasdasdasd' & @CRLF & _
                '<test123sasdasd>' & @CRLF & _
                'a333333' & @CRLF & _
                'aasdasd' & @CRLF & _
                'a444444' & @CRLF & _
                'a555555' & @CRLF & _
                '<test2222asdasd>' & @CRLF & _
                'a6666666' & @CRLF & _
                'a777777'
;~MsgBox(0, '源字符串', $sSource)
Local $aSRE = StringRegExp($sSource, '(?s)(?!test123.*test2222)a\d+', 3)
If Not @Error Then MsgBox(0, '匹配数量: ' & UBound($aSRE), '其中[0]元素为: ' & $aSRE[0])
_ArrayDisplay($aSRE, UBound($aSRE))
[/mw_shl_code]
[mw_shl_code=applescript,true]a111111111
a22222222
addsdf
asdasdasdasd
<test123sasdasd>
a333333
aasdasd
a444444
a555555
sadasd
sadasd
<test2222asdasd>
a6666666
a777777
a88888[/mw_shl_code]
发表于 2018-7-21 22:07:54 来自手机 | 显示全部楼层
本帖最后由 Duvet 于 2018-7-21 22:10 编辑
heavenm 发表于 2018-7-21 20:56
你说的逻辑漏洞是指啥,我试试看,代用到多的数据里试试看

如果數據來源出現兩組test2222的話,有可能會返回多餘的結果

点评

很厉害,你写的,我都还没能理解  发表于 2018-7-21 22:09
发表于 2018-7-21 21:50:15 来自手机 | 显示全部楼层
你可以利用class值是固定的來找,href="(/product/\d+.html)">\s+<div class="img-box">

点评

嗯!这个方法比较简单,可以找到正确的数据  发表于 2018-7-21 22:02

评分

参与人数 1金钱 +150 贡献 +40 收起 理由
heavenm + 150 + 40

查看全部评分

发表于 2018-7-21 21:14:45 来自手机 | 显示全部楼层
不用加(?s)啊,詳細的部分我再幫您看看

点评

嗯,我还在试图理解你的代码,按你的写法貌似是不用(?s)  发表于 2018-7-21 21:21
我的天,你是雷锋啊!求抱抱  发表于 2018-7-21 21:20
发表于 2018-7-21 17:50:14 | 显示全部楼层
本帖最后由 Duvet 于 2018-7-21 18:07 编辑

用手機寫出來了,礙於手邊沒測試工具,請各位朋友幫忙測試一下,謝謝。

(?:test123.+\r\n(?:(?!a\d).*\r\n)*|\G(?<!\A)(?:(?!a\d).*\r\n)*)(a\d+)\r\n(?=[\s\S]+?test2222)
應該可以使用吧?
我發現這方式有個邏輯漏洞
還是推薦用兩步的方式呦

点评

我的天,你竟然真写出来了,正则出神入化,我正学习你的代码,太厉害了,我都已经用分步去搞了,改成你的试试  发表于 2018-7-21 20:55

评分

参与人数 1金钱 +50 贡献 +2 收起 理由
afan + 50 + 2 向大师学习!

查看全部评分

发表于 2018-7-21 16:02:29 | 显示全部楼层
Duvet 发表于 2018-7-21 15:41
First:test123(.*)test2222
Second:a\d+
來看看afan有沒有更好的解法

大师都看不懂,我更懵逼了…
从期望的结果来判,LZ的正则肯定不对
这种情况下,我一般也同大师一样,采取分步匹配的方式,既对效率有好处,且易懂易改
 楼主| 发表于 2018-7-21 11:54:13 | 显示全部楼层
本帖最后由 heavenm 于 2018-7-21 12:07 编辑

匹配的内容不对

应该只匹配到3条才对

[2]a333333
[3]a444444
[4]a555555
发表于 2018-7-21 13:35:33 | 显示全部楼层
你这个问题怕是afan的回答才比较权威。
发表于 2018-7-21 15:12:20 来自手机 | 显示全部楼层
本帖最后由 Duvet 于 2018-7-21 15:26 编辑

我也看不懂,坐等afan
(?s)(?!test123.*test2222)a\d+
後面不含test123到test2222的文字,並截取以a開頭數字結尾的字串
結果卻是含test123到test2222的文字,這不是很矛盾嗎?


发表于 2018-7-21 15:41:53 来自手机 | 显示全部楼层
本帖最后由 Duvet 于 2018-7-21 15:43 编辑

First:test123(.*)test2222
Second:a\d+
來看看afan有沒有更好的解法
 楼主| 发表于 2018-7-21 16:39:04 | 显示全部楼层
afan 发表于 2018-7-21 16:02
大师都看不懂,我更懵逼了…
从期望的结果来判,LZ的正则肯定不对
这种情况下,我一般也同大师一样,采 ...

连A版都搞不定,看来一句代码搞不定,只能分步操作了!我以为可以一步到位
 楼主| 发表于 2018-7-21 16:39:55 | 显示全部楼层
脑壳都想疼了,我发现我总会纠结这种问题哈哈!总想一句代码搞定!
发表于 2018-7-21 17:00:06 来自手机 | 显示全部楼层
大師是您才對。一行好像可以又好像不行,我再想想
发表于 2018-7-21 17:08:14 | 显示全部楼层
本帖最后由 fang5072546 于 2018-7-21 17:10 编辑

你这个问题很好解释啊,首先,抛开?!语法不说,你有自己测试过(?s)(test123.*test2222)这句匹配的内容?自己可以用
(?s)(?!test123.*test2222).*测试,发现除了<以外的所有字符都在匹配范围,换句话说,你其实寻找的条件是你那字符串除了<之外的所有字符串中查找a开头,后面紧跟着任意数字的字符,很显然,所有带a的都匹配上了,这是意料之中.
关于4楼说的矛盾,其实你这样去理解就可以茅塞顿开了.假设有一段话,
我是正则表达式测试    你要找的是<!正则表达式测试>.正则表达式是一个个字符串去跟条件匹配的,虽然我们的表达式是多个字符串,但是正则表达式在匹配的时候,其实是把他解释为单个字符串的.具体的可以找个带DEBUG的工具,看看回溯机制以及匹配次数就知道了.正则表达式在执行的时候,就会检索,从我开始,发现后面不是正则表达式测试,那么他就匹配上了,然后从是开始,发现后面是正则表达式测试,这时候他就会标记是为未匹配,然后从正开始,正后面跟的是则表达式,并不是我们的条件正则表达式,所以正也匹配上了,以及类推,则,表..所以我们的语句最终的匹配结果是我正则表达式测试.

评分

参与人数 1金钱 +50 贡献 +1 收起 理由
afan + 50 + 1 完美诠释了“费劲的正则解释”

查看全部评分

 楼主| 发表于 2018-7-21 20:56:25 | 显示全部楼层
Duvet 发表于 2018-7-21 17:50
用手機寫出來了,礙於手邊沒測試工具,請各位朋友幫忙測試一下,謝謝。

(?:test123.+\r\n(?:(?!a\d).*\r ...

你说的逻辑漏洞是指啥,我试试看,代用到多的数据里试试看
 楼主| 发表于 2018-7-21 21:08:52 | 显示全部楼层
Duvet 发表于 2018-7-21 17:50
用手機寫出來了,礙於手邊沒測試工具,請各位朋友幫忙測試一下,謝謝。

(?:test123.+\r\n(?:(?!a\d).*\r ...

代入到复杂的代码里面好像不行不知道是不是我写得有问题[mw_shl_code=applescript,true](?s)(?:product-list-wrapper.+\r\n(?:(?!/product/\d).*\r\n)*|\G(?<!\A)(?:(?!/product/\d).*\r\n)*)(/product/\d+.html)\r\n(?=[\s\S]+?product-list-pager)[/mw_shl_code]

本帖子中包含更多资源

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

×
 楼主| 发表于 2018-7-21 21:17:27 | 显示全部楼层
[mw_shl_code=applescript,true](/product/\d+.html).*\r\n(?=[\s\S]+?product-list-pager)[/mw_shl_code]
只用最后一段,第一条多匹配到一条数据
您需要登录后才可以回帖 登录 | 加入

本版积分规则

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

GMT+8, 2024-12-24 01:34 , Processed in 0.082137 second(s), 22 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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