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

标签 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”。

问题:为什么?
目标:我想匹配一个整数,丢弃任何错误的输入。

例如如果 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/

相关文章:

javascript - jquery .toggleClass on click 使用多个 ID

javascript - Gmail 是单页应用程序吗

c# - dd-MMM-yyyy 和 dd-MMM 的正则表达式?

regex - 期望中的正则表达式

c++ - 解析字符串的正则表达式模式

javascript - 如何更改下拉菜单的样式

javascript - 当我尝试获取特定 div 时,为什么我的 .load() 不起作用

javascript - STS Spring MVC : How to include a JS file in a JSP

c# - 用于在编译器输出中查找警告和错误的正则表达式

java - 单独的正则表达式匹配,但它们的并集不匹配