2011-11-08 151 views
1

我創建的功能與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; 
} 
+0

如果現有文件名爲filename99.jpg,您是否想要打破兩位數前導零數字格式? – nnnnnn

+1

filename.match(/(\ d +)[^ \ d] + $ /)[1]? –

回答

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. 添加前導零
+0

夢幻般的pimvdb!這解決了我的問題! – funkyfly

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」。如果您只想匹配數字後面有其他字符的位置,只需將*更改爲+以匹配一個或更多的非數字結尾。

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的情況下,數量低於零。我會讓你的。