Javascript:正则表达式匹配/替换不按预期工作

时间:2014-03-25 15:37:33

标签: javascript regex

给出以下代码:

    $('.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”)。

2 个答案:

答案 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修饰符

相关问题