我正在使用以下代码来否定正则表达式中的字符。通过检查反向,我可以确定输入的值是否格式正确。基本上,任何数字都可以被允许但只有一个小数点(放在字符串中的任何位置。)我现在的方式,它捕获所有数字,但允许多个小数点(创建无效的浮点数。)我如何调整为捕获多个小数点(因为我只想允许一个小数点)?
var regex = new RegExp(/[^0-9\.]/g);
var containsNonNumeric = this.value.match(regex);
if(containsNonNumeric){
this.value = this.value.replace(regex,'');
return false;
}
这是我期待发生的事情:
首先,有效输入是任意数量的数字,可能只有一个小数点。当前行为:用户逐个输入字符,如果它们是有效字符,则会显示。如果字符无效(例如字母A),该字段将用''替换该字符(在填充字符后立即表现得像一个退格。我需要的是添加一个太多小数点的相同行为。
答案 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"));