63

我有一个文件名,其中可以包含多个点,并且可以以任何扩展名结尾:

tro.lo.lo.lo.lo.lo.png

我需要使用正则表达式将最后出现的点替换为另一个字符串@2x,然后再次替换点(非常像视网膜图像文件名),即:

tro.lo.png -> tro.lo@2x.png

这是我到目前为止所拥有的,但它不会匹配任何东西......

str = "http://example.com/image.png";
str.replace(/.([^.]*)$/, " @2x.");

有什么建议么?

4

9 回答 9

113

您不需要为此使用正则表达式。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);
}

看到它在行动

更新:一个正则表达式解决方案,只是为了好玩:

str = str.replace(/\.(?=[^.]*$)/, "@2x.");

匹配一个文字点,然后断言((?=)肯定的前瞻)直到字符串末尾没有其他字符是点。替换应包括匹配的一个点,除非您想删除它。

于 2012-06-21T08:12:02.923 回答
30

只需在替换字符串中使用特殊替换模式: $1

console.log("tro.lo.lo.lo.lo.lo.png".replace(/\.([^.]+)$/, "@2x.$1"));
// "tro.lo.lo.lo.lo.lo@2x.png"

于 2012-06-21T08:16:10.657 回答
6

您可以使用表达式\.([^.]*?)

str.replace(/\.([^.]*?)$/, "@2x.$1");

您需要引用$1子组以将该部分复制回结果字符串。

于 2012-06-21T08:13:20.313 回答
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);
​
于 2012-06-21T08:15:42.203 回答
3

要匹配从字符串开头直到(包括)最后一个字符出现的所有字符,请使用:

^.*\.(?=[^.]*$)  To match the last occurrence of the "." character

^.*_(?=[^.]*$)   To match the last occurrence of the "_" character
于 2013-10-15T21:07:13.170 回答
2

用于\.匹配一个点。该字符.匹配任何字符。

因此str.replace(/\.([^\.]*)$/, ' @2x.')

于 2012-06-21T08:12:01.530 回答
1

你可以简单地这样做,

> "tro.lo.lo.lo.lo.lo.zip".replace(/^(.*)\./, "$1@2x");
'tro.lo.lo.lo.lo.lo@2xzip'
于 2014-09-21T04:33:38.813 回答
1

为什么不简单地拆分字符串并将所述后缀添加到倒数第二个条目:

var arr = 'tro.lo.lo.lo.lo.lo.zip'.split('.');
arr[arr.length-2] += '@2x';
var newString = arr.join('.');
于 2014-10-22T04:46:09.663 回答
1
'tro.lo.lo.lo.lo.lo.png'.replace(/([^\.]+).+(\.[^.]+)/, "$1.@x2$2")
于 2015-12-16T17:14:19.250 回答