【问题标题】:regex: remove leading zeros, but keep single zero正则表达式:删除前导零,但保留单个零
【发布时间】:2020-03-03 14:35:58
【问题描述】:

我有一个输入字段,我绑定了一个格式化函数,每当该字段失去焦点时就会触发该函数。

我的目标是从输入中删除所有前导零,并且我确实通过以下行实现了这一点。但是,当用户想要输入单个 0 或类似 0000 的内容时,我仍然希望该字段以值 0(单个)结尾。使用.replace(/^0+/, ''),它将删除每个零并仅返回一个空字符串。有人知道什么正则表达式可以处理这个吗?

const formatNumber = ($field) => {
var number = $field.val().replace(/\./g, '').replace(/\s/g, '').replace(/^0+/, '');
return number;
};

注意if(number === "") number = "0" 不是一个选项。

edit1::我注意到似乎有些混乱。例如,“0009825”需要变为 9825 而不是 09825。我想要一个 0 的唯一实例是值为零时。

【问题讨论】:

  • 使用.replace(/^0{2,}/, '');
  • .replace(/^0+/, '0')?如果要保留单个 0,则不应将开头的所有 1+ 零替换为空字符串,而应替换为单个 0
  • 你也可以把它绑在字符串的末尾。不确定这是否可行,因为我不是 javascript 开发人员,但在这里您匹配所有前导 zeor 和任何后续数字字符串。第二组现在将匹配单个零或任何其他数字,然后您可以使用它来覆盖字符串。 .replace(/^(0+)(\d+)$/, '\2')
  • @wiktor 在“004560”的情况下,我不想要一个零。仅当输入的值为 0 或多个零时。
  • 然后添加$/^0+$/,告诉正则表达式只匹配一个1+零字符串

标签: javascript regex


【解决方案1】:

simple reg exp 带有前导零并匹配捕获组中的一位数

const cleanZeros = str => str.replace(/^0+(\d)/, '$1')


var tests = ["0009876","0", "0000", "9999", "0090000"]
tests.forEach( s => console.log(s, cleanZeros(s)))

【讨论】:

    【解决方案2】:

    你可以使用这个正则表达式替换:

    .replace(/^(?:0+(?=[1-9])|0+(?=0$))/mg, '')
    

    RegEx Demo

    正则表达式详细信息:

    • ^:开始
    • (?:: 启动捕获组
      • 0+(?=[1-9]):匹配 1 个或多个零,后面必须跟 1-9
      • |:或者
      • 0+(?=0$):匹配 1 个或多个零,后面必须跟一个 0 并结束
    • ):结束捕获组

    替换为空字符串,如果字符串中只有零,将留下一个0,否则将删除前导零。


    替代解决方案使用捕获组:

    str = str.replace(/^0+(0$|[1-9])/mg, '$1');
    

    【讨论】:

      猜你喜欢
      • 2011-12-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-27
      • 1970-01-01
      • 1970-01-01
      • 2020-02-21
      相关资源
      最近更新 更多