Подтвердить что ты не робот

RegEx, который будет соответствовать последнему вхождению точки в строке

У меня есть имя файла, которое может иметь несколько точек в нем и может заканчиваться любым расширением:

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

Мне нужно использовать регулярное выражение для замены последнего вхождения точки другой строкой, например @2x, а затем снова точкой (очень похожей на имя файла изображения сетчатки), то есть:

tro.lo.png -> [email protected]

Вот то, что у меня есть до сих пор, но ничего не будет соответствовать...

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

любые предложения?

4b9b3361

Ответ 1

Для этого вам не нужно регулярное выражение. 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.");

Соответствует литеральной точке, а затем утверждает ((?=)положительный результат), что никакой другой символ до конца строки не является точка. Замена должна включать одну точку, которая была сопоставлена, если вы не хотите ее удалить.

Ответ 3

Вы можете использовать выражение \.([^.]*?):

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

Вам нужно ссылаться на подгруппу $1, чтобы скопировать часть обратно в результирующую строку.

Ответ 4

рабочая демо-версия 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);
​

Ответ 5

Чтобы совместить все символы с начала строки до (и включая), последнее использование символа используется:

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

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

Ответ 6

Используйте \. для сопоставления точки. Символ . соответствует любому символу.

Поэтому str.replace(/\.([^\.]*)$/, ' @2x.').

Ответ 8

Почему бы просто не разбить строку и добавить указанный суффикс во вторую-последнюю запись:

var arr = 'tro.lo.lo.lo.lo.lo.zip'.split('.');
arr[arr.length-2] += '@2x';
var newString = arr.join('.');

Ответ 9

'tro.lo.lo.lo.lo.lo.png'.replace(/([^\.]+).+(\.[^.]+)/, "[email protected]$2")