给出以下代码:
$('.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”。
问题:为什么?
目标:我想匹配一个整数,丢弃任何错误的输入。
例如如果 val 为“234.4”,则保留“234.4”;如果 val 有任何错误的符号,例如“a234.4b”,我想保留“234.4”;如果 val 有不明确的条目,例如“234.4.5”或“234.4x23.5”,我想保留第一个可匹配的数字实例(两种情况下均为“234.4”)。
最佳答案
这是因为.*
是贪婪的。发生的情况是整个字符串首先与 .*
匹配。然后就会发生回溯的情况。这基本上意味着.*
一次返回一个字符,以便正则表达式的其余部分可以匹配。
长话短说,使用这样的东西,这是懒惰的:
val.replace(/^.*?([0-9]+(\.[0-9]+)?).*$/, '$1');
<小时/>
描述:
当输入为234
时, .*
匹配所有内容,然后返回一个字符。在这一点上,.*
正在匹配23
和([0-9]+(\.[0-9]+)?).*$
正在匹配4
,这是完全可以接受的,也是比赛在这里结束的原因。
当您使用.*?
时,它首先尝试匹配 0 个字符,然后 ([0-9]+(\.[0-9]+)?).*$
。剩余部分与整个数字匹配,并且正则表达式再次满足。简单来说,这就是懒惰和贪婪的区别。
或者,您也可以将数字与 [0-9]+(?:\.[0-9]+)?
相匹配。并将匹配项放入 replacedVal
.
关于Javascript:正则表达式匹配/替换未按预期工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22639367/