#javascript #regex
#javascript #регулярное выражение
Вопрос:
Я создаю функциональность для увеличения последнего числа в имени файла на 1.
Примеры:
filename01.jpg => filename02.jpg
file01name01.jpg => file01name02.jpg
file01na01me.jpg => file01na02me.jpg
Я борюсь со случаями, когда исходное имя файла содержит одно и то же число два или более раз. Я только хочу увеличить последнее число в имени файла.
Я провел некоторое исследование, но не смог найти правильное регулярное выражение. Возможно, кто-нибудь мог бы мне помочь.
В идеале я хочу, чтобы мой код выглядел примерно так:
var filename = "somefilename";
var newFilename = filename.replace(regex,lastNumber 1);
Я не уверен, что это можно сделать так просто. Но мне нужно выяснить регулярное выражение, прежде чем двигаться дальше.
Благодаря pivmvb, вот мое окончательное решение:
function getIncreasedFileName(fileName){
var newFileName = fileName.replace(/(D )(d )(D )$/,
function(str, m1, m2, m3) {
var newstr = ( m2 1) "";
return m1 new Array(m2.length 1 - newstr.length).join("0") newstr m3;
})
return newFileName;
}
Комментарии:
1. Вы хотите изменить формат чисел, состоящий из двух цифр с начальным нулем, если существующее имя файла
filename99.jpg
?2. filename.match(/(d )[^d] $/)[1]?
Ответ №1:
"test01.jpg".replace(/(D )(d )(D )$/, function(str, m1, m2, m3) {
var newstr = ( m2 1) "";
return m1 new Array(3 - newstr.length).join("0") newstr m3;
// m1 === "test"
//
// m2 === "01"
// So:
// m2 1 === 2
//
// ( m2 1) "" === "2"
// (convert to string, call this `newstr`)
//
// new Array(3 - newstr.length).join("0") === "0"
// (this adds an appropriate amount of leading zeroes
// so that the total length is 2)
//
// m3 === ".jpg"
});
Где:
D one or more non-digits
d one or more digits
D one or more non-digits
$ end of string (so it only matches the last digits)
Затем замените соответствующую строку функцией, которая возвращает новую строку, выполнив следующее:
- добавление 1 к числу
- добавление начальных нулей
Ответ №2:
Вот что я придумал:
var newFilename = filename.replace(/(d )(D*$)/g ,
function(match, c1, c2) {
var nextNum = ( c1 1);
return (nextNum < 10 ? "0" nextNum : nextNum) c2;
});
Обратите внимание, что я использовал D*
для сопоставления нуля или более не цифр между последним числом и концом строки, так что это изменит «filename.01» на «filename.02» и «name01» на «name02». Если вы хотите сопоставить только там, где после числа есть другие символы, просто измените *
на
, чтобы сопоставить одну или более не цифр в конце.
Ответ №3:
Вы можете сначала найти последние цифры, увеличить их, а затем выполнить замену:
m = filename.match(/([0-9][0-9])([^0-9]*)$/);
incr = parseInt(m[1]) 1;
newFilename = filename.replace(/([0-9][0-9])([^0-9]*)$/, incr "$2");
Это не добавляет дополнение 0 в случае, если число меньше нуля. Я предоставляю это вам.