求指正一段正则表达式 - V2EX
请不要在回答技术问题时复制粘贴 AI 生成的内容
EchoFUN

求指正一段正则表达式

  •  
  •   EchoFUN Jan 17, 2014 5105 views
    This topic created in 4522 days ago, the information mentioned may be changed or developed.
    需求是要给网站的静态的文件打版本号。

    比如模板中的某段原代码如下:
    <link rel="stylesheet" href="/static/css/main.css?v=$$$$$$$$$$">
    最终在node.js脚本处理后需要变成
    <link rel="stylesheet" href="/static/3333333333/css/main.css">
    中间的3333333333是当前静态文件的版本号

    小弟正则的功力比较浅。
    尝试着写了一段,/"\/(static)\w+\?v=\${10}"/gi,想用Javascript的replace进行替换。
    却死活匹配不上, 跪求大神指点。
    19 replies    1970-01-01 08:00:00 +08:00
    Mutoo
        1
    Mutoo  
       Jan 17, 2014   1
    因为 \w 不包括 /

    \w 相当于 [A-Za-z_]
    slowman
        2
    slowman  
       Jan 17, 2014   1
    (static\/)(.*?)\?v=([^\"]*)
    $1$3$2
    效果:
    http://regexr.com?381l4

    不知为何我感觉提问正则的描述问题时都有点含糊不清
    zhujinliang
        3
    zhujinliang  
       Jan 17, 2014   1
    \w 不匹配 / 和 . 这两个符号吧
    可以用 [^?] 来代替,意思是非 ? 的字符,或者用 [\w\./] 堆砌出需要的字符

    要替换的话需要给后面的 css/main.css 分一个组吧
    最终正则: /"\/static\/([^?]+)\?v=\${10}"/

    要替换的话,这样用: test.replace(/"\/static\/([^?]+)\?v=\${10}"/gi, '"/static/3333333333/$1"')
    switch
        4
    switch  
       Jan 17, 2014   1
    test.replace(/(\/static\/)(.*)(?=[?&]v=)(?:([?&])v=(\d+)(&?))/, function ($0, $1, $2, $3, $4, $5) {
    return $1 + $4 + "/" + $2 + ("?" === $3 ? ("&" === $5 ? "?" : "") : $5);
    })
    EchoFUN
        5
    EchoFUN  
    OP
       Jan 17, 2014
    谢谢大家,试了下。
    这个正则应该够用了。
    test.replace(/("\/static)(\/[^"\?]*)\?v=(\${10})"/ig, function($0, $1, $2, $3) {
    return $1 + '/3333333333' + $2 + '"';
    });
    @switch 写的好复杂哈,我消化消化。
    mengzhuo
        6
    mengzhuo  
       Jan 17, 2014   1
    继续四处强调,xml用解析器,不要用正则
    zhaoyafei
        7
    zhaoyafei  
       Jan 17, 2014
    @zhujinliang 正则大牛,求有时间帮忙写个搞rss的
    EchoFUN
        8
    EchoFUN  
    OP
       Jan 18, 2014
    @mengzhuo 有道理哈。但是模板文件里边有拼装HTML的逻辑。并非单纯的xml哦。
    EchoFUN
        9
    EchoFUN  
    OP
       Jan 18, 2014
    @zhaoyafei 原来是个用萌妹子头像的汉子,刚准备兴冲冲的表示要手把手教你点什么的。。。
    ETiV
        10
    ETiV  
       Jan 18, 2014
    @EchoFUN 这个人很逗, 因为他楼上刚说过"强调, XML用解析器, 不要用正则".

    他来一句"正则大牛, 求有时间帮忙写个搞RSS的"
    alexrezit
        11
    alexrezit  
       Jan 18, 2014 via iPhone
    楼主明显是个逗比.
    leechan
        12
    leechan  
       Jan 18, 2014
    楼主,一定需要这么复杂的正则么?我觉得如果只是要把上面的字符串变换成下面的形式的话就不需要这么复杂呀

    str.replace(/\?v=\${10}/g, '').replace('static/', 'static/333333333/')

    我觉得这样就可以了呀
    EchoFUN
        13
    EchoFUN  
    OP
       Jan 18, 2014
    @leechan 哥,别闹!会砸饭碗的。
    zztczcx
        14
    zztczcx  
       Jan 18, 2014
    s.replace(/(\/css.*)\?v\=(.*)(\".*)$/g,"/$2$1$3")
    SoloCompany
        15
    SoloCompany  
       Jan 18, 2014
    为什么不改成
    <link rel="stylesheet" href="/static/$$project.version$$/css/main.css”>

    然后源代码里面直接就有 $$project.version$$ 这个目录存在,这样替换起来多简单
    EchoFUN
        16
    EchoFUN  
    OP
       Jan 18, 2014 via Android
    @SoloCompany 开发思路可能跟你说的不一样哈,不是所有的静态文件都要打版本号的,需要更新版本的静态在文件后边加上 ?v=$$$$$$$$$
    xoyo
        17
    xoyo  
       Jan 19, 2014
    @mengzhuo 人家这匹配的是xml文本里某个值的内容,用xml解释器怎么做呢?
    ianva
        19
    ianva  
       Jan 20, 2014
    过滤脚本可以用 sed
    / *<link/{
    s:\(/static/\)\([^\?][^\?]*/\)*\([a-z0-9_-][a-z0-9_-]*.css\)?v=\([0-9]*\)\":\1\4/\2\3:
    }
    About     Help     Advertise     Blog     API     FAQ     Solana     2888 Online   Highest 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 58ms UTC 01:57 PVG 09:57 LAX 18:57 JFK 21:57
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86