2012-03-21 71 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

相关问题