如果子串存在则正则表达式匹配字符串的另一部分

时间:2013-03-23 04:12:59

标签: javascript regex yui yui3

我正在使用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来完成,但由于局限性(我只能使用正则表达式),我需要找到一个正则表达式解决方案。

1 个答案:

答案 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"