RegEx仅匹配错误匹配的数字

时间:2013-04-19 20:56:01

标签: javascript regex numbers match

我试图在JavaScript中使用正则表达式来匹配包含小数的数字或数字。正则表达式看起来像[0-9]+ | [0-9]* \. [0-9]+

但是,由于某些原因,此'1A'.match(/^[0-9]+|[0-9]*\.[0-9]+$/)错误地找到匹配项。我不确定表达式的哪一部分与A匹配。

3 个答案:

答案 0 :(得分:4)

问题在于你的改变。这就是它所说的:

  ^[0-9]+           # match an integer at the start
|                   # OR
  [0-9]*\.[0-9]+$   # match a decimal number at the end

所以第一个选择匹配。

您需要对交替进行分组:

/^(?:[0-9]+|[0-9]*\.[0-9]+)$/

?:是一种优化和良好的习惯。它抑制了在给定情况下不需要的捕获。

你可以在没有轮换的情况下离开,但是:

/^[0-9]*\.?[0-9]+$/

甚至更短:

/^\d*\.?\d+$/

答案 1 :(得分:3)

'1A'.match(/^[0-9]+|[0-9]*\.[0-9]+$/)找到匹配项,因为它是以下的联合:

^[0-9]+

[0-9]*\.[0-9]+$

第一场比赛。

要避免这种情况,请将它们分组:^([0-9]+|[0-9]*\.[0-9]+)$

试试这个:

'1A'.match(/^([0-9]+|[0-9]*\.[0-9]+)$/) === null


可替换地:

function matchExacly(str, regex) {
    var tmp = str.match(regex);
    return tmp ? tmp[0] === str : false;
}

matchExacly('1A', /[0-9]+|[0-9]*\.[0-9]+/) === false

matchExacly('1', /[0-9]+|[0-9]*\.[0-9]+/) === true

答案 2 :(得分:1)

也许我在错误的地方,但如果你只使用正则表达式验证数值,为什么不使用更快的替代品,如下所示:

var isNumber = ( +n === parseFloat(n) );