美文网首页让前端飞
不得不知的正则( 二 )

不得不知的正则( 二 )

作者: 会会会会 | 来源:发表于2018-12-17 11:41 被阅读12次

    总结了那么多,正式进入激动的操练吧

    练习一

    场景是,比如写一个后端接受到前端返回的错误上报数据,可以拿到当前的referrer,但是我们想要匹配出是那个页面的路由报的错,这时候:
    ——目标匹配出referrer中的路由
    referrer大概张这个样子
    "https://ymobile-cn.ankerjiedian.com/hd/group_lottery?label=grinch&utm_source=share&from=timeline&isappinstalled=0"
    我们想要得到是是 /hd/group_lottery

    骚做分析斜杆 / 应该是关键,但是这里的 :// 给匹配过程造成了巨大的痛点,与其写一大堆排除他的代码,不如直接用slice截掉

    从左到右进行匹配分析

    • 第一步 slice截掉 ://
    var referrer =  "[https://ymobile-cn.ankerjiedian.com/hd/group_lottery?label=grinch&utm_source=share&from=timeline&isappinstalled=0](https://ymobile-cn.ankerjiedian.com/hd/group_lottery?label=grinch&utm_source=share&from=timeline&isappinstalled=0)"
    
    var newReferrer = referrer.split("://")[1] ? referrer.split("://")[1] : referrer.split("://")[0]
    

    得到newReferrer = "ymobile-cn.ankerjiedian.com/hd/group_lottery?label=grinch&utm_source=share&from=timeline&isappinstalled=0](https://ymobile-cn.ankerjiedian.com/hd/group_lottery?label=grinch&utm_source=share&from=timeline&isappinstalled=0)'

    • 第二步
      匹配一个斜杆/,因为后面的斜杆都要,所以后面的字符用.匹配 ,是0到多次,就是.+,
      再看,我们不需要匹配出路由参数,就是不要问号及后面的东西
      直接上结果把
    const routes = newReferrer.match(/\/(?!\/)[^?]+/g);
    

    返回 /hd/group_lottery
    两个斜杆中间的是正则匹配代码,/正则/

    匹配一个斜杆需要转译 所以是 /
    /(?!/) 就是匹配一个斜杆,并且后面不是斜杆,
    [^?] 然后在匹配一个不是?的字符
    [^?]+ 再对这个字符进行0到多次匹配
    g就是全局匹配的意思
    完成

    练习二

    这是我在网上抄的一个比较有意思的例子

    目标:查找一个具有6位字符的,含有“cat”的单词。

    解决一

    排列组合法,排列出所有可能的位置:

    cat\w{3}|\wcat\w{2}|\w{2}cat\w|\w{3}cat
    

    非常蠢,但是对简单的还是很实用,

    解决二

    是我们需要一个6位的字符,二是单词含有“cat”。
    那我们就想匹配出一个6位字符;
    用单词边界 \b,和向前位置匹配
    \w是匹配单词的意思
    就是匹配一个单词边界后面是6个单词的字符串;\b\w{6}\b

    \b\wcat\w\b,匹配一个cat,前后是长度为0到多个的一个单词;

    (?=\b\w{6}\b)\b\w*cat\w*\b
    

    简化

    \b(?=\w{6}\b)\w{0,3}cat\w*
    

    \b(?=\w{6}\b)就是匹配一个长度为6的单词,主要这是只是位置匹配,还没有匹配任何字符,对后面单词起约束作用

    \w{0,3}cat\w*
    \w{0,3}匹配一个长度是0到3的单词,比如没有,或者q,qq,qqq都可以
    然后是匹配一个cat
    然后后面又是匹配一个长度0到多次的单词,以为前面\b(?=\w{6}\b) 已经进行约束,所以这里最近用*匹配就可以了

    最后

    好了以后我遇到有意思的匹配练习再补充吧

    参考博客,极力推荐
    深入浅出之正则表达式

    相关文章

      网友评论

        本文标题:不得不知的正则( 二 )

        本文链接:https://www.haomeiwen.com/subject/hhsqkqtx.html