我有以下输入:
123456_r.xyz
12345_32423_131.xyz
1235.xyz
237213_21_mmm.xyz
现在我需要将第一个连接的数字填充到8个前面带0的数字:
00123456_r.xyz
00012345_32423_131.xyz
00001235.xyz
00237213_21_mmm.xyz
我尝试分割一个点,然后在下划线处拆分(如果存在)并获取第一个数字并填充它们。
但是我觉得只有一个函数才能有一个更有效的正则表达式替换函数,对吗?这看起来怎么样?
TIA 马特
答案 0 :(得分:4)
我会使用正则表达式,但只是为了拆分:
var input = "12345_32423_131.xyz";
var output = "00000000".slice(input.split(/_|\./)[0].length)+input;
结果:"00012345_32423_131.xyz"
编辑:
我在评论中提出的快速,无分裂但无正则表达式的解决方案:
"00000000".slice(Math.min(input.indexOf('_'), input.indexOf('.'))+1)+input
答案 1 :(得分:2)
我根本不会分裂,只需替换:
"123456_r.xyz\n12345_32423_131.xyz\n1235.xyz\n237213_21_mmm.xyz".replace(/^[0-9]+/mg, function(a) {return '00000000'.slice(0, 8-a.length)+a})
答案 2 :(得分:2)
有一个简单的正则表达式可以找到要替换的字符串部分,但是您需要使用a replace function来执行所需的操作。
// The array with your strings
var strings = [
'123456_r.xyz',
'12345_32423_131.xyz',
'1235.xyz',
'237213_21_mmm.xyz'
];
// A function that takes a string and a desired length
function addLeadingZeros(string, desiredLength){
// ...and, while the length of the string is less than desired..
while(string.length < desiredLength){
// ...replaces is it with '0' plus itself
string = '0' + string;
}
// And returns that string
return string;
}
// So for each items in 'strings'...
for(var i = 0; i < strings.length; ++i){
// ...replace any instance of the regex (1 or more (+) integers (\d) at the start (^))...
strings[i] = strings[i].replace(/^\d+/, function replace(capturedIntegers){
// ...with the function defined above, specifying 8 as our desired length.
return addLeadingZeros(capturedIntegers, 8);
});
};
// Output to screen!
document.write(JSON.toString(strings));