小鱼儿yr 发表于 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才对?不知道我的猜测是否正确?是否有大神帮忙解惑?先谢了~

afan 发表于 2021-4-26 16:46:41

正则只能靠自己多练多理解,因为解释起来很费劲
(?!exp) 指的是你要检测的在前面就放前面,反之就放后面。“比如用正则表达式提取后面不是小写字母的7位数字” 这是检测后面,那肯定是放后面 \d{7}(?!) 是对的。
“帮助里的表达式\b((?!abc)\w)+\b里的分组放在前面是否合理正确” 是对的,“+” 位置也没错。只不过需要使用标志4才能获取到。如果使用标志3,则需要修改为 \b(?:(?!abc)\w)+\b

小鱼儿yr 发表于 2021-4-26 17:15:52

afan 发表于 2021-4-26 16:46
正则只能靠自己多练多理解,因为解释起来很费劲
(?!exp) 指的是你要检测的在前面就放前面,反之就放后面。 ...

感谢afan大神解惑,这下明白了大半。:face (23):

haijie1223 发表于 2021-4-26 22:52:31

我理解能力有限,没看懂楼主对第一图的的疑惑在哪里。
你自己写的那个表达式的疑惑,是这样的:(?!express) 匹配后面跟的不是 express 的位置 。你的(?!express)写在哪里,就判断哪里的后面的位置。

你的原始文本:
1234567a

3425135D

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


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

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

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


小鱼儿yr 发表于 2021-4-26 23:41:38

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

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





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

正则表达式感觉虽然复杂但很强大,在这里学到了不少知识~
页: [1]
查看完整版本: 关于正则表达式的一个知识点疑惑【已解决】