求指正一段正则表达式 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
请不要在回答技术问题时制粘贴 AI 生成的内容
EchoFUN
V2EX    程序员

求指正一段正则表达式

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

比如模板中的某段原代码如下:
<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_]
slowman
    2
slowman  
   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 写的好复杂哈,我消化消化。
    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     Solana     3022 人在线   最高记录 6679       Select Language
创意工作者们的社区
World is powered by solitude
VERSION: 3.9.8.5 24ms UTC 12:48 PVG 20:48 LAX 05:48 JFK 08:48
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