RegEx将匹配字符串中最后一次出现的点

时间:2012-06-21 08:09:38

标签: javascript jquery regex string

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

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

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

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

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

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

有什么建议吗?

9 个答案:

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