RegEx, который будет соответствовать последнему вхождению точки в строке
У меня есть имя файла, которое может иметь несколько точек в нем и может заканчиваться любым расширением:
tro.lo.lo.lo.lo.lo.png
Мне нужно использовать регулярное выражение для замены последнего вхождения точки другой строкой, например @2x
, а затем снова точкой (очень похожей на имя файла изображения сетчатки), то есть:
tro.lo.png -> [email protected]
Вот то, что у меня есть до сих пор, но ничего не будет соответствовать...
str = "http://example.com/image.png";
str.replace(/.([^.]*)$/, " @2x.");
любые предложения?
Ответы
Ответ 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.");
Соответствует литеральной точке, а затем утверждает ((?=)
положительный результат), что никакой другой символ до конца строки не является точка. Замена должна включать одну точку, которая была сопоставлена, если вы не хотите ее удалить.
Ответ 2
Просто используйте специальный шаблон замены $1
в строке замены:
console.log("tro.lo.lo.lo.lo.lo.png".replace(/\.([^.]+)$/, "@2x.$1"));
// "[email protected]"
Ответ 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.')
.
Ответ 7
Вы могли бы просто сделать это,
> "tro.lo.lo.lo.lo.lo.zip".replace(/^(.*)\./, "[email protected]");
'[email protected]'
Ответ 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")