2012-03-21 68 views
2

所有數字。這Perl腳本是我想在JavaScript實現的東西(source):JavaScript中,正則表達式,添加前導零包含在字符串

s/([0-9]+)/sprintf('%04d',$1)/ge; 

顯然的sprintf沒有在JavaScript中使用,但我知道你可以建立一個函數直接工作的問題的數量,但在我的情況下,我有一個很長的字符串,可能包含多個數字字符串,如:abc8 23 123到這個:abc000008 000023 000123(使用6位數字作爲例子)。

因此,它可能是我沒有得到的一些聰明的正則表達式,或者以某種方式找到某種方式將長字符串拆分爲不同的字符串和數字的數組,並且只對數字進行一次一個的操作。

我真的很想避免後一種方法,因爲1)在這種情況下,速度是一個問題,2)在正確的位置分割字符串所涉及的正則表達式似乎比在此處添加前導零更困難。

最後,還有什麼其他的方法可以用JavaScript的正則表達式去解決嗎?

回答

4

您可以使用正則表達式查找號碼,並取代它們與值從一個函數:

s = s.replace(/\d+/g, function(m){ 
    return "00000".substr(m.length - 1) + m; 
}); 

演示:http://jsfiddle.net/Guffa/sEUHY/

+0

簡短而親切! Btw。 「m.length - 1」而不是「m.length」的任何原因? – Shaw 2012-03-22 00:11:48

+1

@Shaw:'m.length - 1'是因爲''00000''字符串沒有額外的未使用的零,它只有需要的時間。由於'm'總是至少有一個字符長,所以你只需要五個零填充它,而當'm.length'爲1時,'m.length - 1'給出0,這是字符串中的起始位置返回全部五個零。你可以使用'「000000」.substr(m.length)',即字符串的長度是你想要的位數,但是這個字符串的第一個字符只是虛擬填充,它從來沒有被使用過。 – Guffa 2012-03-22 07:21:53

2

http://jsfiddle.net/hHfUC/1/

的正則表達式是相當簡單的,只需將補丁數字傳遞給一個函數,並將修改後的匹配作爲替換返回。

"abc8 23 123".replace(/\d+/g,function(x){ return zeroFill(parseInt(x),6) }) 

Requred zeroFill功能

function zeroFill(number, width){ 
    if (number.toString().length >= width) 
    return number; 
    return (new Array(width).join('0') + number.toString()).substr(-width); 
} 
+0

太好了,儘管Guffa的答案對我的使用更簡單/更快。 謝謝你花時間回答我的問題。 – Shaw 2012-03-22 00:12:08

+0

是的,他的回答比較簡單。它也會截​​斷比填充更長的數字。如果這不是問題,那麼使用和濫用它,〜) – 2012-03-22 09:25:48

相關問題