我正在使用YUI3 library并使用filter来匹配和替换部分网址。
因为过滤器不是很灵活,我只能提供一个用于搜索的正则表达式,然后是一个用于替换匹配的字符串:
filter: {
searchExp : "-min\\.js",
replaceStr: "-debug.js"
}
在我的情况下,我有一个如下所示的网址:
http://site.com/assets/js?yui-3.9.0/widget-base/assets/skins/sam/widget-base.css&yui-3.9.0/cssbutton/cssbutton-min.css
如果有/assets/js
个文件,我想匹配.css
。如果参数包含CSS文件,那么它将始终只包含CSS文件。
到目前为止,我已经写了一个小的正则表达式来检查最后是否存在.css
:
.*\.css$
但是,现在,如果我们有匹配,我想返回/assets/js
作为匹配。这是用正则表达式做的事吗?
就个人而言,我宁愿用简单的函数和简单的if / else来完成,但由于局限性(我只能使用正则表达式),我需要找到一个正则表达式解决方案。
答案 0 :(得分:0)
这有点被黑客攻击,但应该做的工作:
var t = new RegExp( "/assets/js(([^\\.]*\\.)*[^\\.]*\\.css)$" )
document.write( "http://site.com/assets/js?yui-3.9.0/widget-base/assets/skins/sam/widget-base.css&yui-3.9.0/cssbutton/cssbutton-min.css".replace( t, "/newthing/$1" ) );
基本上,它会搜索/assets/js
,然后搜索任何字符,然后搜索.css
。如果整个事物匹配它将用新文本替换它,并在它之后包括匹配的模式(从第一个括号)。 <{1}}之前的所有内容都不包含在匹配中,因此不需要包括在内。
我想你的库在内部使用/assets
,所以这些字符串应该可以工作。具体地,
replace
我不太确定你想对结果做什么,但是这允许你更改文件夹并添加后缀(以及首先检查两个令牌的存在)。要添加后缀,请将替换更改为:
"/assets/js(([^\\.]*\\.)*[^\\.]*\\.css)$"
"/newthing/$1"