我有一个输入字段,我在其中绑定了一个格式化函数,每当该字段失去焦点时就会触发该函数。
我的目标是从输入中删除所有前导零,并且我确实通过以下行实现了这一点。但是,当用户想要输入单个 0 或类似 0000 的内容时,我仍然希望该字段以值 0(单个)结尾。它将.replace(/^0+/, '')删除所有零并仅返回一个空字符串。有人知道什么正则表达式可以处理这个问题吗?
const formatNumber = ($field) => {
var number = $field.val().replace(/\./g, '').replace(/\s/g, '').replace(/^0+/, '');
return number;
};
Run Code Online (Sandbox Code Playgroud)
注意:if(number === "") number = "0"不是一个选项。
edit1: : 我注意到似乎有点混乱。例如“0009825”需要变成9825而不是09825。我想要前面的0的唯一情况是当值只是零时。
您可以使用此正则表达式替换:
.replace(/^(?:0+(?=[1-9])|0+(?=0$))/mg, '')
Run Code Online (Sandbox Code Playgroud)
正则表达式详细信息:
^: 开始(?::开始捕获组
0+(?=[1-9]):匹配 1 个或多个零,后面必须有1-9 |: 或者0+(?=0$):匹配 1 个或多个零,后面必须跟有 10并结束):结束捕获组0替换为空字符串,如果字符串中只有零,则将保留单个字符串,否则将删除前导零。
使用捕获组的替代解决方案:
str = str.replace(/^0+(0$|[1-9])/mg, '$1');
Run Code Online (Sandbox Code Playgroud)
带有前导零的简单正则表达式并匹配捕获组中的一位数字
const cleanZeros = str => str.replace(/^0+(\d)/, '$1')
var tests = ["0009876","0", "0000", "9999", "0090000"]
tests.forEach( s => console.log(s, cleanZeros(s)))Run Code Online (Sandbox Code Playgroud)