V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
EchoFUN
V2EX  ›  程序员

求指正一段正则表达式

  •  
  •   EchoFUN · 2014-01-17 21:03:22 +08:00 · 4158 次点击
    这是一个创建于 3949 天前的主题,其中的信息可能已经有所发展或是发生改变。
    需求是要给网站的静态的文件打版本号。

    比如模板中的某段原代码如下:
    <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 条回复    1970-01-01 08:00:00 +08:00
    Mutoo
        1
    Mutoo  
       2014-01-17 21:28:11 +08:00   ❤️ 1
    因为 \w 不包括 /

    \w 相当于 [A-Za-z_]
    1423
        2
    1423  
       2014-01-17 21:29:39 +08:00   ❤️ 1
    (static\/)(.*?)\?v=([^\"]*)
    $1$3$2
    效果:
    http://regexr.com?381l4

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

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

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

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

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

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

    然后源代码里面直接就有 $$project.version$$ 这个目录存在,这样替换起来多简单
    EchoFUN
        16
    EchoFUN  
    OP
       2014-01-18 14:06:09 +08:00 via Android
    @SoloCompany 开发思路可能跟你说的不一样哈,不是所有的静态文件都要打版本号的,需要更新版本的静态在文件后边加上 ?v=$$$$$$$$$
    xoyo
        17
    xoyo  
       2014-01-19 22:39:37 +08:00
    @mengzhuo 人家这匹配的是xml文本里某个值的内容,用xml解释器怎么做呢?
    ianva
        19
    ianva  
       2014-01-20 22:15:58 +08:00
    过滤脚本可以用 sed
    / *<link/{
    s:\(/static/\)\([^\?][^\?]*/\)*\([a-z0-9_-][a-z0-9_-]*.css\)?v=\([0-9]*\)\":\1\4/\2\3:
    }
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2633 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 29ms · UTC 03:39 · PVG 11:39 · LAX 19:39 · JFK 22:39
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.