正则表达式替换文件名中的最后一个数字

时间:2011-11-08 11:50:50

标签: javascript regex

我正在创建一个功能,用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;
}

3 个答案:

答案 0 :(得分:2)

"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. 添加前导号

答案 1 :(得分:1)

以下是我提出的建议:

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“。如果您只想匹配号码后面有其他字符的位置,只需将*更改为+即可匹配一个或更多的非数字。

答案 2 :(得分:0)

您可以先找到最后的数字,然后增加它们,然后进行替换:

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。我会告诉你的。