给出以下代码:
$('.numericOnly').change(function(e){
var val = $(this).val();
var replacedVal = val.replace(/^.*([0-9]+(\.[0-9]+)?).*$/, '$1');
console.log(val);
console.log(replacedVal);
});
控制台在输入值为“234”时打印“234”和“4”,在“234.8”时打印“8”。
问题:为什么?
目标:我希望匹配整数,丢弃任何错误输入。
E.g。若val是“234.4”,则保持“234.4”;如果val有任何错误的符号,例如“a234.4b”,我想保留“234.4”;如果val有不明确的条目,比如“234.4.5”或“234.4x23.5”,我想保留第一个matcheable数字实例(两种情况下都是“234.4”)。
答案 0 :(得分:2)
这是因为.*
贪婪。会发生的是整个字符串首先由.*
匹配,然后发生了一些名为回溯的事情。这基本上意味着.*
一次返回一个字符,以便正则表达式的其余部分可以匹配。
长话短说,使用这样的东西,这是懒惰的:
val.replace(/^.*?([0-9]+(\.[0-9]+)?).*$/, '$1');
说明
当输入为234
时,.*
匹配所有输入,然后返回一个字符。在此特定点,.*
匹配23
,([0-9]+(\.[0-9]+)?).*$
匹配4
,这是完全可以接受的,也就是匹配在此结束的原因。
当您使用.*?
时,它首先尝试匹配0个字符,然后([0-9]+(\.[0-9]+)?).*$
。剩下的部分与整数相匹配,再次满足正则表达式。这就是懒惰和贪婪之间的区别。
或者,您也可以将一个数字与[0-9]+(?:\.[0-9]+)?
匹配,然后将匹配项放入replacedVal
。
答案 1 :(得分:0)
使用此正则表达式:
[0-9]+(?:\.[0-9]*)?
没有全局g
修饰符