鱼C论坛

 找回密码
 立即注册
查看: 915|回复: 17

[已解决]正则表达式

[复制链接]
发表于 2020-4-27 20:24:58 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
.*?  这个表达式,  大佬们能举个例子说下嘛,越详细越好,我百度了好久了,就是想不通,比如爬取某个网址的图片的时候,<img src="test.jpg" width="60px" height="80px"/>,这行
最佳答案
2020-4-28 09:27:55
本帖最后由 悠悠2264 于 2020-4-28 09:33 编辑
czh1303541051 发表于 2020-4-27 23:48
大哥你没看懂我意思,方便留个qq或者vx吗,感觉不实时指导我是看不懂这个正则表达式了



我再讲详细点。

.是表示任意一个字符(除换行符),如字符串:char="a",正则表达式:char=".",就会匹配到char="a"

.*表示匹配多个字符(除换行符)并开启贪婪模式。如字符串:str="this is a string",正则表达式:str=".*",则就会匹配到str="this is a string"
但如果字符串是:str="this is a string" char="a",这样他就会匹配到所有的,也就是:str="this is a string" char="a",这就是贪婪模式,匹配最多的,越多越好,恨不得全部匹配了。

是.*?的话,这就表示匹配多个字符(除换行符)并开启非贪婪模式,如字符串:str="this is a string" char="a",正则表达式:str=".*?",他就会匹配:str="this is a string"也就是匹配最少的,越少越好。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-4-27 20:28:19 | 显示全部楼层
<img src="test.jpg" width="60px" height="80px"/>
src是图片地址
width是宽度
height是高度
数字就是多宽多高
px是单位
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-4-27 20:32:04 | 显示全部楼层
百度一下,正则的贪心与非贪心
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-4-27 20:42:04 | 显示全部楼层
Hello. 发表于 2020-4-27 20:28
src是图片地址
width是宽度
height是高度

我是想知道.*?在这里怎么来运作的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-4-27 20:42:48 | 显示全部楼层
BngThea 发表于 2020-4-27 20:32
百度一下,正则的贪心与非贪心

看了,但是看不懂,转不过弯来,麻烦以这个为例解释一下
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-4-27 20:47:26 | 显示全部楼层
czh1303541051 发表于 2020-4-27 20:42
看了,但是看不懂,转不过弯来,麻烦以这个为例解释一下

https://zhuanlan.zhihu.com/p/81460886
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-4-27 21:03:46 | 显示全部楼层
本帖最后由 悠悠2264 于 2020-4-27 21:21 编辑

.表示任意一个字符(除换行符),*表示匹配前面的子表达式(也就是前面的.)0次或多次,?跟在.*后面则表示开启非贪婪模式。
非贪婪模式也就是匹配最少的字符,比如正则表达式:a.*?c,字符串是:abcdcba,匹配的就会是abc,而不是abcdc。

爬取图片的时候也就需要开启非贪婪模式(不开的话则会从第一个img标签匹配到最后的img标签),即在.*后加?,正则表达式如:<img src=".*?" width=".*?" height=".*?"/>
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-4-27 21:20:04 | 显示全部楼层
悠悠2264 发表于 2020-4-27 21:03
.表示任意一个字符(除换行符),*表示匹配前面的子表达式(也就是前面的.)0次或多次,?跟在.*后面则表示 ...

还是没看懂,真看不懂这东西,就以你这个例子来说,如果是a.*c,字符串会是啥
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-4-27 21:22:01 | 显示全部楼层
本帖最后由 悠悠2264 于 2020-4-27 21:26 编辑
czh1303541051 发表于 2020-4-27 21:20
还是没看懂,真看不懂这东西,就以你这个例子来说,如果是a.*c,字符串会是啥


会是:abcdc,多了dc,因为要求最后一个字符是c,这个是匹配最多的情况。
所以说贪婪模式(.*)是匹配最多的,非贪婪模式(.*?)匹配最少的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-4-27 21:29:31 | 显示全部楼层
悠悠2264 发表于 2020-4-27 21:22
会是:abcdc,多了dc,因为要求最后一个字符是c,这个是匹配最多的情况。
所以说贪婪模式(.*)是匹配最 ...

'<li>.*?<img src = "(.*?)" width = .*?</li>'
那这又是什么意思,这是我看教程上讲师写得爬图片用的正则表达式,单单去看那些简单的例子我是能看懂,这个真看不懂
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-4-27 21:36:08 | 显示全部楼层
本帖最后由 悠悠2264 于 2020-4-27 21:38 编辑


.*?就是匹配最少的字符,如果你不加问号,它就会从第一个<li>匹配到最后一个<img src = "(.*?)" width = .*?</li>,就等于是把所有的<li><img>标签都放在一个字符串里,而要求应该是吧每个<li><img>标签放到不同的字符串里,所有要加?,开启非贪婪模式。

加括号不加括号无所谓,没有优先级的问题,只是美观点
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-4-27 22:01:00 | 显示全部楼层
悠悠2264 发表于 2020-4-27 21:36
.*?就是匹配最少的字符,如果你不加问号,它就会从第一个匹配到最后一个

我貌似突然看懂了,一直理解不对,是不是这样理解
如:<img src="test.jpg" width="60px" height="80px"/>
懒惰模式正则:
src=".*?"
结果:src="test.jpg"
因为匹配到第一个"就结束了一次匹配。不会继续向后匹配。
这个.*?判断的不是.   是.前面的那个"    我一直以为判断的是.这个任意字符
是这样理解吗
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-4-27 22:32:20 | 显示全部楼层
本帖最后由 悠悠2264 于 2020-4-27 22:43 编辑
czh1303541051 发表于 2020-4-27 22:01
我貌似突然看懂了,一直理解不对,是不是这样理解
如:
懒惰模式正则:


?是非贪婪模式,不是贪婪模式,反掉了。匹配到src="test.jpg"是对的。
.是表示任意一个字符(除空格),不是文件名里的.
其他的理解是对的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-4-27 23:48:19 | 显示全部楼层
悠悠2264 发表于 2020-4-27 22:32
?是非贪婪模式,不是贪婪模式,反掉了。匹配到src="test.jpg"是对的。
.是表示任意一个字符(除空格) ...

大哥你没看懂我意思,方便留个qq或者vx吗,感觉不实时指导我是看不懂这个正则表达式了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-4-28 09:15:26 From FishC Mobile | 显示全部楼层
看书吧,没书就看小甲鱼的https://fishc.com.cn/forum.php?mod=viewthread&tid=99281&extra=page%3D2&mobile=2
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-4-28 09:27:55 | 显示全部楼层    本楼为最佳答案   
本帖最后由 悠悠2264 于 2020-4-28 09:33 编辑
czh1303541051 发表于 2020-4-27 23:48
大哥你没看懂我意思,方便留个qq或者vx吗,感觉不实时指导我是看不懂这个正则表达式了



我再讲详细点。

.是表示任意一个字符(除换行符),如字符串:char="a",正则表达式:char=".",就会匹配到char="a"

.*表示匹配多个字符(除换行符)并开启贪婪模式。如字符串:str="this is a string",正则表达式:str=".*",则就会匹配到str="this is a string"
但如果字符串是:str="this is a string" char="a",这样他就会匹配到所有的,也就是:str="this is a string" char="a",这就是贪婪模式,匹配最多的,越多越好,恨不得全部匹配了。

是.*?的话,这就表示匹配多个字符(除换行符)并开启非贪婪模式,如字符串:str="this is a string" char="a",正则表达式:str=".*?",他就会匹配:str="this is a string"也就是匹配最少的,越少越好。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-4-28 09:38:53 | 显示全部楼层
悠悠2264 发表于 2020-4-28 09:27
我再讲详细点。

.是表示任意一个字符(除换行符),如字符串:char="a",正则表达式:char=".", ...

看懂了,谢大佬耐心解答
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-4-28 09:40:57 | 显示全部楼层
czh1303541051 发表于 2020-4-28 09:38
看懂了,谢大佬耐心解答

懂了就好
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-26 22:43

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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