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

alt*_*alt 54 javascript regex string jquery

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

tro.lo.lo.lo.lo.lo.png
Run Code Online (Sandbox Code Playgroud)

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

tro.lo.png -> tro.lo@2x.png
Run Code Online (Sandbox Code Playgroud)

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

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

有什么建议?

Jon*_*Jon 98

你不需要正则表达式.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);
}
Run Code Online (Sandbox Code Playgroud)

看到它在行动.

更新:正则表达式解决方案,只是为了它的乐趣:

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

匹配一个文字点,然后断言((?=)正面的预测),直到字符串末尾的其他字符都不是一个点.替换应包括匹配的一个点,除非您要删除它.

  • @JacksonGariety.它更具可读性,而且速度更快. (3认同)

Sal*_*n A 27

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

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

  • 正确回答OP问题. (2认同)
  • @Qtax:不完全,因为如果最后一个点也是最后一个字符,它将无法工作. (2认同)

小智 6

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

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

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


Tat*_*nit 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);
?
Run Code Online (Sandbox Code Playgroud)