哎,面试又来了,兄弟们。这次是个老熟人——正则表达式,具体点是面试官甩了这么一道题:“说说 (.*) 和 (.*?) 有啥区别?”
我当时脑子嗡一下,这题熟得不能再熟了,真是大厂面试常青树。不过这种基础题千万不能掉以轻心,咱们程序员嘛,虽然天天写代码,但正则这种东西,平时写得少,背不过去,真有可能一不小心踩坑。今天就来聊聊这个问题,顺便写点代码,大家伙儿以后别在面试栽跟头了。正则里的“贪婪”与“非贪婪”,不懂真吃亏
这题核心其实就俩词:“贪婪匹配”和“非贪婪匹配”。
• (.*) 是贪婪的,意思就是“能多匹配点就多匹配点”,哪怕把整个字符串吞了,它也不嫌多。
• (.*?) 是非贪婪的,又叫“懒惰匹配”,遇事不慌,匹配到符合条件的最少字符就收手。
举个例子直观点:
看到没,贪婪的 (.*) 啥都不嫌多,它从 <b> 一直吃到最后一个 </b>,连标签都一口吞了。而非贪婪的 (.*?),只要够用就好,优雅地停在了第一个 </b> 前。
要是写个爬虫,解析 HTML 标签,用错了这个,可能把整篇网页内容都吞了,回头调试能调出心理阴影。
问题来了,这俩东西背后的原理是啥?
其实正则的匹配过程,就像找女朋友(咳,找对象吧,咱别局限性别)。贪婪型的是“我都行,能多就多”,遇到符合条件的,就一直往后找;非贪婪型是“差不多得了,合适就收手”,遇到满足条件的最小范围就罢手。
再来个更复杂的例子,看看真功夫:
贪婪匹配的 (.*) 直接从第一个 <div> 干到最后一个 </div>,中间的标签都给包圆了;非贪婪的 (.*?) 则老老实实,一对一对应,把 first 和 second 各自揪出来。
这就好比你在菜市场买菜,贪婪型是整筐全买,非贪婪型是挑挑拣拣,拿最合适的。
面试官心里在想啥?
这类问题,面试官其实不是想听你背书,而是想看看你能不能通过简单的例子,把复杂的概念解释明白。能说清楚“贪婪”和“非贪婪”的区别,最好再加点应用场景,稳了。
比如我会加一句:“这个在爬虫里经常用,比如提取某些标签内容的时候,非贪婪匹配更靠谱,不然容易匹配超出预期的范围。”这话一说,面试官八成会点点头,心里OS:这哥们真写过爬虫啊。
程序员的吐槽:正则真是个狠人
不得不说,正则表达式这玩意,真是个狠角色。刚学的时候,觉得它就是乱码,^$*+?.| 一堆符号组合起来,像是古老的咒语。后来慢慢上手,发现正则能干的事儿是真的多,字符串处理、日志分析、数据提取,哪哪都有它。
不过啊,正则写多了,也有点后遗症。有时候调试一个正则,能写得头秃——尤其是复杂嵌套的时候,简直像是在玩俄罗斯方块,拼不好就爆炸。
说个段子:
程序员修 bug:写个正则修一个 bug,发现有两个 bug,写个更复杂的正则,三个 bug诞生了。
但别说,正则再难,也得硬着头皮上。毕竟谁让咱是程序员呢?
最后,如果你哪天在项目里发现自己写的正则不对劲,记得回来看看贪婪和非贪婪这对兄弟,别让它们坑了你。
行了,今天就聊到这儿,你们有啥正则踩坑经历,评论区唠唠呗?
扫码二维码 获取免费视频学习资料
- 本文固定链接: http://phpxs.com/post/12998/
- 转载请注明:转载必须在正文中标注并保留原文链接
- 扫码: 扫上方二维码获取免费视频资料
查 看2022高级编程视频教程免费获取