需要一个正则表达式来过滤除了一个小数点以外的所有内容。

4

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

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个回答

16

据我理解,下面的代码可能是您正在寻找的:

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.5,它会被接受。如果我在后面加上任何数字,也会被接受(期望的行为)。然而,如果文本框中已经有1.5,然后再添加一个点(1.5.),第一个点就会被删除(是期望的),第二个点则保留。因此,当输入1.5.(尾随点)时,我得到的是15.1(不好,应该删除最后一个点并将其保留为1.5)。如果我在末尾添加一个1(输入字符:1.5.1),我最终得到的是15.1。如果我再添加一个点,我得到的是151。有什么想法吗?如果需要,我可以发送更多的代码。 - dihakz
我修改了我的答案,以更好地满足您的需求。圣诞快乐。 - Jan Legner
谢谢,Jan!祝你也圣诞快乐。 - dihakz
所选答案导致脚本在Mac上的Safari版本10.1.2中停止执行(无效的正则表达式)。 - Tom Senner
@TomSenner 正则表达式的哪一部分是无效的? - Jan Legner
@Jan Legner,这段代码:str.replace(/ [^0-9.] | .(?=.*.) / g, ""); - Tom Senner

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"));


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