【问题标题】:JavaScript, Regex, add leading zero to ALL number contained in stringJavaScript,正则表达式,将前导零添加到字符串中包含的所有数字
【发布时间】:2012-03-21 20:48:53
【问题描述】:

这个 Perl 脚本是我想用 JavaScript (source) 实现的:

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

显然 sprintf 在 JavaScript 中不可用,但我知道您可以构建一个直接处理关注数字的函数,但是在我的情况下,我有一个长字符串,其中可能包含多个要转换的数字字符串如:abc8 23 123 变为:abc000008 000023 000123(以 6 位为例)。

所以要么是一些我没有得到的聪明的正则表达式,要么以某种方式将长字符串拆分为不同的字符串和数字组成的数组,并且只对数字一个接一个地起作用。

我真的想避免后一种方法,因为 1) 在这种情况下速度是一个问题,以及 2) 在正确的位置拆分字符串所涉及的正则表达式似乎比此时添加前导零更难。

最后,有没有其他方法可以用 JavaScript 的正则表达式来解决它?

【问题讨论】:

    标签: javascript regex printf


    【解决方案1】:

    您可以使用正则表达式来查找数字,并将它们替换为函数中的值:

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

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

    【讨论】:

    • 又短又甜!顺便提一句。 m.length - 1 而不是 m.length 的任何原因?
    • @Shaw:m.length - 1 是因为"00000" 字符串没有多余的未使用的零,它只在需要时使用。由于m 始终至少有一个字符长,因此您只需要用五个零来填充它,而当m.length 为1 时,m.length - 1 为您提供0,这是返回所有五个零的字符串中的起始位置。您可以使用"000000".substr(m.length),即字符串的长度是您想要的位数,但字符串的第一个字符只是虚拟填充,从未使用过。
    【解决方案2】:

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

    正则表达式非常简单,只需将修补后的数字传递给函数,然后返回修改后的匹配作为替换。

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

    需要zeroFill函数

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

    【讨论】:

    • 很好,尽管 Guffa 的回答对我来说更简单/更快。感谢您抽出宝贵时间回答我的问题。
    • 是的,他的回答比较简单。它还会切断比填充更长的数字。如果这不是问题,请使用和滥用它,~)
    【解决方案3】:

    或者……亚诺……

    ("0000"+var).slice(-4); // Normal old JS `0000${var}`.slice(-4); // Sexier JS

    第一次评估将我们的变量var 强制转换为字符串文字,在其前面加上 n 0(因此对于 123 的值,我们以 "0000123" 结束,然后切片 从字符串的末尾开始(否定修饰符)向后计数n个字符(如“0000123”或“0123”)。

    这里可爱的部分是我可以定义一个全局常量 (const ZedsPadBabyZedsPad='00000000000000';),然后它可用于几乎任何典型的铅填充应用程序,从 5 位图像编号 (img00011.jpg) 到日期 (02/01 /04) 到(军事)时间:(07:00)。

    不想要 0?很酷。字符串,宝贝。 `WhatACROCK${'you'}`.slice(-4) // 'ROCKyou'

    【讨论】:

      【解决方案4】:

      稍微改进@Guffa 的回答器:

      现在您可以通过给定的total_length 参数指定填充零后的总长度。

      function addLeadingZero(str, total_length = 4) {
        const leading_zeros = '0'.repeat(total_length)
        str = str.replace(/\d+/g, function(m) {
          return leading_zeros.substr(m.length) + m
        })
        return str
      }
      
      console.log(addLeadingZero("abc8 23 123", 0))
      console.log(addLeadingZero("abc8 23 123", 5))
      console.log(addLeadingZero("abc8 23 123", 6))

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2023-03-23
        • 1970-01-01
        • 1970-01-01
        • 2010-12-30
        • 1970-01-01
        • 2011-06-27
        • 2023-04-01
        相关资源
        最近更新 更多