正则表达式应该怎么学?

正则表达式应该怎么学?

学习正则表达式最好的方式是读《精通正则表达式》这本书:

《精通正则表达式》

建议认真学完前6章,后面与具体编程语言相关的可以跳过。花一些时间系统地学习一下正则表达式是非常有好处的。就像张无忌学会九阳神功后学其他武功都特别快,学会正则表达式后再学习UNIX/Linux的下的工具也都特别快!

除了推荐书籍,我也分享一下我自己读写正则表达式的心得。

如何读正则表达式?

《精通正则表达式》这本书让我认识到,正则表达式只是一种描述字符串长什么样的声明式语言,是字符串的元信息。就像SQL是用来描述数据长什么样的声明式语言,只是SQL使用更直观的英文单词作为关键词,而正则表达式使用的是更加精炼但也更加晦涩的符号字符。

所以,学习正则表达式与学习其他语言的过程是一样的,需要学会这门语言的词法语法语义。如果对这些词法、语法、语义不熟悉,看正则表达式就像天书一样。

词法

前文所述,正则表达式的单词由标点符号字符组成。和汉语、英语等自然语言一样,这些单词也有词性,包括字符(character)、字符类(character class)、分组(grouping)、量词(quantifier)、锚点(Anchor)等。

想要一股脑记住所有符号及其含义,就像从头到尾背英语词典一样,是很低效且痛苦的。好在正则表达式的单词也符合2-8法则,就像英语里的常用词一样并不多,诸如零宽断言等用法其实不太常用,用到的时候临时查文档复习一下用法就行。

以下几个字符是最最常用的元字符:

单词

词性

语义

^

锚点

以……开头

$

锚点

以……结尾

.

字符集

任意字符

*

量词

任意多个

+

量词

1个或多个

?

量词

0个或1个

需要注意的是,除了惰性匹配的量词,其他量词默认都是贪心匹配,即尽可能多地匹配、直到无法匹配为止。

语法

正则表达式的语法并不多,除了要开闭括号要能一一对应,也就是量词只能放在字符、字符集、分组的后面。

示例

举个例子:

/^ab+c*$/

模式读作:“有一些字符串,它们以1个a开头,紧接着1个或多个b,最后以任意多个c结尾。”符合这个规则的字符串很多,有“ab”、“abc”、“abbccc”等等。

如何写正则表达式?

有了前文读正则表达式的基础,基本上也能照葫芦画瓢写正则表达式了,但新手在写正则表达式的时候往往容易忽略“上下文”,会写出非常具体、非常长的模式。因为正则表达式的主要用途就是用于文本匹配,所谓的“上下文”就是正则表达式预计在那些文本中匹配。上下文不同,解法也可以不同。

举个例子,一个爬虫爬取到以下HTML页面信息:

  • Home
  • Friends
    • Bob
    • William
    • Vina

    假设希望在这些内容中匹配出包含「朋友姓名」的行,比较简单的方式有:

    /class=”name”/

    还能更简洁一些:

    /name/

    或者更具体一些:

    /[^]+/

    这三种方式哪种最好呢?这个得视情况而定。我的建议是:

    如果数据来源比较可控,例如内部系统生成的数据,则尽量写简单有效的模式;

    如果数据来源不可控,例如网络爬虫从外部系统抓取的数据,内容随时都有可能发生变化,那适度地优化一下正则表达式,让模式具备一些弹性去适应可预见的一些变化。

    如果让我来写这个例子的正则表达式,我会倾向于这样写:

    /class=”[^”]*bnameb[^”]*”/

    这样既具备一定的弹性,例如未来添加了其他class,或li换成其他tag,都能自动适应;又不会过于复杂。

    综上所述,正则表达式并没有唯一的标准答案,需要根据待匹配文本的上下文选择复杂度最合适的方案。因此,写正则表达式时不用着急,不必要求自己一次就写对。应该像写SQL一样在数据集上多select几次,对数据集有了较全面的认知后,不断修正数据过滤条件,就能优化出比较精炼的SQL;同样的,写正则表达式也是在目标字符串上反复筛选,最后就能优化出比较精炼的模式。

    郑重声明:本文内容及图片均整理自互联网,不代表本站立场,版权归原作者所有,如有侵权请联系管理员(admin#wlmqw.com)删除。
    (0)
    用户投稿
    上一篇 2022年7月27日
    下一篇 2022年7月27日

    相关推荐

    • 无人直播赚钱模式骗局 无人直播带货骗局3980学费

      昨天在刷抖音时,无意间发现有人关注了我,并互动了,我出于礼貌给了一下回关,没想到下午抖音语音电话就响了,电话接通后,说是”抖音客服的,是专门对新人帐号的一个带教的,如何涨粉、如何变…

      2022年10月30日
    • 在使用Towify制作小程序时如何导入本地数据?

      在使用Towify制作小程序时,导入本地数据的操作也十分简单,分为以下五个步骤: 一:打开数据中心 二:上传 CSV 文件 三:确认导入行数 四:调整表结构 五:导入完成 只需这简…

      2022年9月20日
    • 《王者荣耀》苹果120帧极高帧率模式什么时候上线?iPhone120帧极高帧率模式上线时间

      《王者荣耀》s29赛季即将迎来更新,此次的版本更新将会针对几个点进行优化,其中iPhone的120帧极高帧率模式也将会同步上线,届时iOS系统的玩家们就可以享受到超高清的游戏体验了…

      2022年9月21日
    • 6月14日周二有两只新股华如科技、慕思股份能否申购?

      周二有两只新股申购,为方便阅读先上结论:【华如科技给予建议申购评级、慕思股份给予积极申购评级】 (注)新股评级依次为:积极申购>建议申购>谨慎申购>放弃申购 同时…

      2022年6月14日
    • 欧航局发布最新银河系多维地图

      新华社巴黎6月13日电(记者陈晨)欧洲航天局13日发布借助“盖亚”空间探测器绘制的银河系多维地图。这是欧航局发布的第三批银河系探测数据,也是迄今最详尽的银河系星系图。 欧航局新闻公…

      2022年6月14日
    • 王者最新资讯

      各位召唤师: 调查启动,目标戈娅!活动已开启! 活动常驻入口:活动中心-活动-【目标戈娅】送头像框语音 活动奖励:戈小娅头像框,限时语音(3个月)“姐带你飞”、“坐稳了,起飞”,无…

      2022年6月27日
    • 人工智能时代下的儿童权利保护

      当前世界,算法、算力、数据等关键要素在时代的不断进步下更进一步,人工智能的应用场景也在飞速地拓展,人工智能时代,即将到来。人工智能的飞速发展使得它不再局限于某几个特定领域,而是向各…

      2022年6月29日
    • 充分运用金融科技赋能,解决商业银行经营管理痛点问题

      金融科技指的是以区块链技术为核心,结合云计算、大数据、人工智能、物联网等现代科技手段,对金融市场产品以及金融服务业务产生重大影响的新型业态场景、新兴业务模式、创新产品服务等提供技术…

      2022年6月14日
    • java设计模式桥接

      /** * @date: 2022/6/2 17:18 * @desc: 台式计算机 */public class BjbComputer extends Computer{ pu…

      2022年7月1日
    • 欧软亮相2022中国制造数字化转型峰会并获年度十大优秀服务商

      6月17日 欧软亮相“2022中国制造数字化转型峰会暨2022·卡恩奖评选颁奖盛典” 荣获「2022卡恩奖·年度十大优秀数字化服务商」 此次峰会,欧软从行业新视角“全方位、全角度、…

      2022年6月22日

    联系我们

    联系邮箱:admin#wlmqw.com
    工作时间:周一至周五,10:30-18:30,节假日休息