找回密码  加入

AUTOIT CN

搜索
查看: 203|回复: 4

[AU3基础] 关于正则表达式的一个知识点疑惑【已解决】

[复制链接]
发表于 2021-4-26 14:50:51 | 显示全部楼层 |阅读模式
本帖最后由 小鱼儿yr 于 2021-4-28 22:00 编辑

以前没研究过正则表达式,最近在报了发哥的培训班,学习正则表达式,感谢发哥的经验,带我入门。也感谢afan大神开发的Au3.REHelper工具。工具里面有个帮助可以学习正则表达式,非常不错。这不,学习到【负向零宽断言】时遇到了个疑惑。如下图红圈里的2个零宽度负预测先行断言的例子中一个是将分组放在匹配前面,另一个是将分组放到匹配后面。到底是该放前面还是后面?还是随便前后都可以?




我测试了一下,比如用正则表达式提取后面不是小写字母的7位数字。
下图是分组放后面


下图是分组放前面

放前面和放后面的结果完全不同,而且放前面没有达到我想要的结果。那么在第一个图片帮助里的表达式\b((?!abc)\w)+\b里的分组放在前面是否合理正确?并且就算正确,是不是“+”号位置是不是写错了?应该写到括号里\b((?!abc)\w+)\b才对?不知道我的猜测是否正确?是否有大神帮忙解惑?先谢了~

本帖子中包含更多资源

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

x
发表于 2021-4-26 16:46:41 | 显示全部楼层
正则只能靠自己多练多理解,因为解释起来很费劲
(?!exp) 指的是你要检测的在前面就放前面,反之就放后面。“比如用正则表达式提取后面不是小写字母的7位数字” 这是检测后面,那肯定是放后面 \d{7}(?![a-z]) 是对的。
“帮助里的表达式\b((?!abc)\w)+\b里的分组放在前面是否合理正确” 是对的,“+” 位置也没错。只不过需要使用标志4才能获取到。如果使用标志3,则需要修改为 \b(?:(?!abc)\w)+\b
 楼主| 发表于 2021-4-26 17:15:52 | 显示全部楼层
afan 发表于 2021-4-26 16:46
正则只能靠自己多练多理解,因为解释起来很费劲
(?!exp) 指的是你要检测的在前面就放前面,反之就放后面。 ...

感谢afan大神解惑,这下明白了大半。
发表于 2021-4-26 22:52:31 | 显示全部楼层
我理解能力有限,没看懂楼主对第一图的的疑惑在哪里。
你自己写的那个表达式的疑惑,是这样的:(?!express) 匹配后面跟的不是 express 位置 。你的(?!express)写在哪里,就判断哪里的后面的位置。

你的原始文本:
1234567a

3425135D

表达式1:\d{7}(?![a-z]) :表示 匹配7个数字,而且后面不能是小写英文字母。所以会匹配到 3425135 。


表达式2:(?![a-z])\d{7} :表示 后面不能是小写字母,然后匹配7个数字。所以两行数字都匹配到了。

有没有觉得 表达式2 很蛋疼,\d{7}既然在(?![a-z])的后面,\d{7}本来就不是小写字母,又何必前面断言呢,是不是有点多余。
也就是说 表达式2 的效果和 \d{7}的效果是一样的。

所以 (?!express) 写在前面的时候,要注意看自己逻辑,比如有 (?![a-z])[a-z]+ 这样一个表达式,试想一下合理不,能不能匹配到东西?


 楼主| 发表于 2021-4-26 23:41:38 | 显示全部楼层
haijie1223 发表于 2021-4-26 22:52
我理解能力有限,没看懂楼主对第一图的的疑惑在哪里。
你自己写的那个表达式的疑惑,是这样的:(?!express ...

感谢发哥在百忙中抽时间指点解惑,主要是(?<!exp2)exp1位置把我搞懵了,现在搞懂了。比如我要获取左边不是小写字母的7个数字,(?<![a-z])不能放在\d{7}的右边,不然的话就会像下面一样。





把(?<![a-z])放在\d{7}的左边就正确了。exp1(?!exp2)刚好是相反的。

正则表达式感觉虽然复杂但很强大,在这里学到了不少知识~

本帖子中包含更多资源

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

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

本版积分规则

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

GMT+8, 2021-5-17 17:59 , Processed in 0.156250 second(s), 20 queries .

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

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