Регулярное выражение для замены последнего числа в имени файла

#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. добавление 1 к числу
  2. добавление начальных нулей

Ответ №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 в случае, если число меньше нуля. Я предоставляю это вам.