RegEx将匹配string中最后一次出现的点

我有一个文件名,可以有多个点,可以结束任何扩展名:

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

我需要使用一个正则expression式来replace最后一次出现的点与另一个string,如@2x ,然后再次点(非常像视网膜图像文件名),即:

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

这是我到目前为止,但它不会匹配任何东西…

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

有什么build议么?

你不需要这个正则expression式。 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); } 

看到它的行动

更新:一个正则expression式的解决scheme,只是为了它的乐趣:

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

匹配一个字面点,然后断言( (?=)是正向 ),直到string末尾没有其他字符是一个点。 replace应该包括一个匹配的点,除非你想删除它。

只需在replacestring中使用特殊replace模式 $1

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

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

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

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

工作演示 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);​ 

匹配从string开始到(包括)最后一次字符使用的所有字符:

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

使用\. 匹配一个点。 人物. 匹配任何字符。

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

你可以这样做,

 > "tro.lo.lo.lo.lo.lo.zip".replace(/^(.*)\./, "$1@2x"); 'tro.lo.lo.lo.lo.lo@2xzip' 

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

 var arr = 'tro.lo.lo.lo.lo.lo.zip'.split('.'); arr[arr.length-2] += '@2x'; var newString = arr.join('.'); 
 'tro.lo.lo.lo.lo.lo.png'.replace(/([^\.]+).+(\.[^.]+)/, "$1.@x2$2")