需要一个RegEx来过滤除一个小数点以外的所有小数点

时间:2014-12-23 22:09:51

标签: javascript regex

我正在使用以下代码来否定正则表达式中的字符。通过检查反向,我可以确定输入的值是否格式正确。基本上,任何数字都可以被允许但只有一个小数点(放在字符串中的任何位置。)我现在的方式,它捕获所有数字,但允许多个小数点(创建无效的浮点数。)我如何调整为捕获多个小数点(因为我只想允许一个小数点)?

var regex = new RegExp(/[^0-9\.]/g);
    var containsNonNumeric = this.value.match(regex);
    if(containsNonNumeric){
        this.value = this.value.replace(regex,'');
        return false;
    }

这是我期待发生的事情:

首先,有效输入是任意数量的数字,可能只有一个小数点。当前行为:用户逐个输入字符,如果它们是有效字符,则会显示。如果字符无效(例如字母A),该字段将用''替换该字符(在填充字符后立即表现得像一个退格。我需要的是添加一个太多小数点的相同行为。

2 个答案:

答案 0 :(得分:5)

据我了解您的问题,下面的代码可能就是您要找的内容:

var validatedStr=str.replace(/[^0-9.]|\.(?=.*\.)/g, "");

它替换除了数字和点(.)之外的所有字符,然后它替换所有点后跟任意数量的0-9个字符,后跟点。


编辑基于第一条评论 - 上面的解决方案删除所有点但是最后一点,作者想要删除除第一个之外的所有点: 由于JS不支持"看后面",解决方案可能是在正则表达式之前反转字符串,然后再将其反转或使用此正则表达式:

var counter=0;
var validatedStr=str.replace(/[^0-9.]|\./g, function($0){
    if( $0 == "." && !(counter++) ) // dot found and counter is not incremented
        return "."; // that means we met first dot and we want to keep it
    return ""; // if we find anything else, let's erase it
});

JFTR:counter++仅在条件的第一部分为true时执行,因此即使对于以字母开头的字符串

也是如此

答案 1 :(得分:1)

以@Jan Legner 的原始正则表达式为基础,通过一对字符串反转来解决行为背后的问题。成功保留第一个小数点。

进行了修改,试图覆盖底片。无法处理不合适的负号和逻辑上应该返回零的特殊情况。

let keep_first_decimal = function(s) {
  return s.toString().split('').reverse().join('').replace(/[^-?0-9.]|\.(?=.*\.)/g, '').split('').reverse().join('') * 1;
};

//filters as expected
console.log(keep_first_decimal("123.45.67"));
console.log(keep_first_decimal(123));
console.log(keep_first_decimal(123.45));
console.log(keep_first_decimal("123"));
console.log(keep_first_decimal("123.45"));
console.log(keep_first_decimal("a1b2c3d.e4f5g"));
console.log(keep_first_decimal("0.123"));
console.log(keep_first_decimal(".123"));
console.log(keep_first_decimal("0.123.45"));
console.log(keep_first_decimal("123."));
console.log(keep_first_decimal("123.0"));
console.log(keep_first_decimal("-123"));
console.log(keep_first_decimal("-123.45.67"));
console.log(keep_first_decimal("a-b123.45.67"));
console.log(keep_first_decimal("-ab123"));
console.log(keep_first_decimal(""));
//NaN, should return zero?
console.log(keep_first_decimal("."));
console.log(keep_first_decimal("-"));
//NaN, can't handle minus sign after first character
console.log(keep_first_decimal("-123.-45.67"));
console.log(keep_first_decimal("123.-45.67"));
console.log(keep_first_decimal("--123"));
console.log(keep_first_decimal("-a-b123"));