我有一个文件名,其中可以包含多个点,并且可以以任何扩展名结尾:
tro.lo.lo.lo.lo.lo.png
我需要使用正则表达式将最后一次出现的点替换为另一个字符串,如@2x
,然后再点一点(非常像视网膜图像文件名),即:
tro.lo.png -> tro.lo@2x.png
这是我到目前为止所拥有的,但它不会匹配任何东西......
str = "http://example.com/image.png";
str.replace(/.([^.]*)$/, " @2x.");
有什么建议吗?
答案 0 :(得分:95)
你不需要正则表达式。 String.lastIndexOf
会这样做。
var str = 'tro.lo.lo.lo.lo.lo.zip';
var i = str.lastIndexOf('.');
if (i != -1) {
str = str.substr(0, i) + "@2x" + str.substr(i);
}
<强> See it in action 强>
更新:正则表达式解决方案,只是为了它的乐趣:
str = str.replace(/\.(?=[^.]*$)/, "@2x.");
匹配一个文字点然后断言((?=)
是positive lookahead),直到字符串末尾的其他字符都不是一个点。替换应包括匹配的一个点,除非您要删除它。
答案 1 :(得分:27)
只需在替换字符串中使用special replacement pattern $1
:
console.log("tro.lo.lo.lo.lo.lo.png".replace(/\.([^.]+)$/, "@2x.$1"));
// "tro.lo.lo.lo.lo.lo@2x.png"
答案 2 :(得分:6)
您可以使用表达式\.([^.]*?)
:
str.replace(/\.([^.]*?)$/, "@2x.$1");
您需要引用$1
子组将该部分复制回结果字符串。
答案 3 :(得分:5)
工作演示 http://jsfiddle.net/AbDyh/1/
<强>码强>
var str = 'tro.lo.lo.lo.lo.lo.zip',
replacement = '@2x.';
str = str.replace(/.([^.]*)$/, replacement + '$1');
$('.test').html(str);
alert(str);
答案 4 :(得分:3)
要匹配字符串开头的所有字符,直到(并包括)字符的最后一次出现:
^.*\.(?=[^.]*$) To match the last occurrence of the "." character
^.*_(?=[^.]*$) To match the last occurrence of the "_" character
答案 5 :(得分:2)
使用\.
匹配一个点。字符.
匹配任何字符。
因此str.replace(/\.([^\.]*)$/, ' @2x.')
。
答案 6 :(得分:1)
你可以这样做,
> "tro.lo.lo.lo.lo.lo.zip".replace(/^(.*)\./, "$1@2x");
'tro.lo.lo.lo.lo.lo@2xzip'
答案 7 :(得分:1)
为什么不简单地拆分字符串并将所述后缀添加到倒数第二个条目:
var arr = 'tro.lo.lo.lo.lo.lo.zip'.split('.');
arr[arr.length-2] += '@2x';
var newString = arr.join('.');
答案 8 :(得分:1)
'tro.lo.lo.lo.lo.lo.png'.replace(/([^\.]+).+(\.[^.]+)/, "$1.@x2$2")