正则表达式:删除前导零,但保留单个零

4
我有一个输入框,我绑定了一个格式化函数,该函数会在该字段失去焦点时触发。
我的目的是从输入中删除所有前导零,并且我已经通过以下行实现了这一点。然而,当用户想要输入单个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"这个选项。
编辑1:我注意到有些人可能会感到困惑,例如“0009825”需要变成“9825”,而不是“09825”。唯一需要在前面加0的情况是当值为零时。

1
使用.replace(/^0{2,}/, ''); - anubhava
.replace(/^0+/, '0')?如果你想保留一个单独的 0,你不应该用空字符串替换开头的所有 1 个或多个零,而是用一个单独的 0 替换。 - Wiktor Stribiżew
您也可以将其绑定到字符串的末尾。不确定这是否有效,因为我不是JavaScript开发人员,但在这里,您可以匹配所有前导零和任何后续数字字符串。第二组将现在匹配单个零或任何其他数字,然后您可以使用该组来覆盖字符串。.replace(/^(0+)(\d+)$/, '\2') - tst
@wiktor 在“004560”的情况下,我不想要前导零。只有在输入的值为0或多个零时才需要。 - tilly
然后添加 $, /^0+$/,告诉正则表达式仅匹配一个或多个零的字符串。 - Wiktor Stribiżew
显示剩余2条评论
2个回答

9
您可以使用以下正则表达式替换:
.replace(/^(?:0+(?=[1-9])|0+(?=0$))/mg, '')

正则表达式演示

正则表达式细节:

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

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


另一种解决方案使用捕获组:

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

5

一个 带前导零的简单正则表达式,并在一个捕获组中匹配一个数字

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


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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接