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

Javascript 需要一个RegExp来过滤除一个小数点以外的所有小数点,javascript,regex,Javascript,Regex,我使用下面的代码对regexp中的字符求反。通过检查倒数,我可以确定输入的值的格式是否正确。本质上,任何数字都可以被允许,但只能有一个小数点(放在字符串中的任何位置)。按照我现在的方式,它捕获所有数字,但允许多个小数点(创建无效浮点)。我如何调整它以捕获多个小数点(因为我只想允许一个) 以下是我期望发生的事情: 首先,有效输入可以是任意数量的数字,可能只有一个小数点。当前行为:用户一个接一个地输入字符,如果它们是有效字符,它们将显示出来。如果该字符无效(例如字母A),则该字段将用“”替换该字符(

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

以下是我期望发生的事情:


首先,有效输入可以是任意数量的数字,可能只有一个小数点。当前行为:用户一个接一个地输入字符,如果它们是有效字符,它们将显示出来。如果该字符无效(例如字母A),则该字段将用“”替换该字符(基本上在填充字符后立即表现为退格)。我需要的是添加过多小数点的相同行为。

据我所知,以下代码可能就是您要查找的代码:

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
时执行,因此它甚至适用于以字母开头的字符串

构建在@Jan Legner的原始正则表达式的基础上,并使用一对字符串反转来处理后视行为。成功保留第一个小数点

通过尝试覆盖负片进行修改。无法处理不合适的负片符号和逻辑上应返回零的特殊情况

先保留\u\u小数=函数{
返回s.toString().split(“”).reverse().join(“”).replace(/[^--0-9.]\.]\.(?=.*\.)/g')。split(“”).reverse().join(“”)*1;
};
//按预期筛选
console.log(保留第一位小数(“123.45.67”);
console.log(保持第一位小数(123));
console.log(保持第一位小数(123.45));
console.log(保持第一位小数(“123”);
日志(保留第一位小数(“123.45”);
log(保持第一位小数(“a1b2c3d.e4f5g”);
日志(保留第一位小数(“0.123”);
console.log(保持第一位小数(“.123”);
日志(保留第一位小数(“0.123.45”);
console.log(保留第一个小数(“123”);
日志(保留第一位小数(“123.0”);
日志(保持第一位小数(“-123”);
console.log(保持第一位小数(“-123.45.67”);
console.log(保持第一位小数(“a-b123.45.67”);
日志(保留第一位小数(“-ab123”);
console.log(保留第一个小数点(“”);
//NaN,应该返回零吗?
console.log(保留第一个小数点(“.”);
console.log(保留第一个小数点(“-”);
//NaN,无法处理第一个字符后的减号
console.log(保持第一位小数(“-123.-45.67”);
console.log(保持第一位小数(“123.-45.67”);
log(保持第一位小数(--123”);

console.log(keep_first_decimal(“-a-b123”));
这是迄今为止最接近的一次。尽管圆点出现了一些有趣的情况。如果我键入1.5,它被接受。如果我在此之后添加任何数字,它也被接受(期望的行为)。但是,如果我在文本框中有1.5,则添加另一个圆点(1.5)。第一个圆点被删除(不需要)第二个点保留。因此,当键入1.5(尾随点)时,如果我在末尾添加1(输入的字符:1.5.1),则得到15.1(不好,应删除最后一个点,并将其保留在1.5)最后我得到了15.1。如果我再加一个点,我得到151。有什么想法吗?如果你需要,我可以发送更多的代码。我编辑了我的答案,使它更适合你的需要。圣诞快乐。谢谢,简!也祝你圣诞快乐。
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
});