【发布时间】:2020-12-02 03:20:58
【问题描述】:
我有正则表达式,它确保任何不符合以下条件的字符都被空字符串替换:
- 必须是数字。
- 可以是正数或负数。
- 可选地可以有十进制值,但不能有尾随小数点。
我的问题:如果发现数字前面的负号,我无法弄清楚如何保留它。我的正则表达式当前用一个空字符串替换了“-”的所有实例。 我在这里遗漏了一些东西以确保不会发生此问题。
var testId = document.getElementById('test');
var validate = value => {
let regex = /([^\d.-]+)|([^\.?\d]+)/g;
return value.toString().trim().replace(regex, '');
};
// Note: in comments, the expected output
var values = [
'12345', // 12345
'-12345', // -12345
'12345.6789', // 12345.6789
'-12345.6789', // -12345.6789
'-123-45.-6789', // -12345.6789
'$12345a6', // 123456
'-1abcde+^~2345.6*#zZ789', // -12345.6789
'50-00', // 5000
'$12345' // 12345
];
values.forEach(value => {
testId.innerHTML += `<p>${value} ==> ${validate(value)}</p>`;
});
<div id="test"></div>
【问题讨论】:
-
@anubhava 现在将添加到上面
-
试试
return value.toString().trim().replace(/[^\d.-]+/g, '').replace(/^([^-]*)(-)|-/g, '$2$1'); -
@WiktorStribiżew 测试值 50-00 ==> -5000 我认为应该改为 5000,不过这个想法很不错
-
所以,
return value.toString().trim().replace(/[^\d.-]+/g, '').replace(/^(-)|-/g, '$1'); -
太好了,请随意添加这个作为答案,如果您不介意解释,我不完全理解第二个正则表达式的工作原理
标签: javascript regex ecmascript-6