0

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

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

4

3 回答 3

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+$/
于 2013-04-19T20:58:26.097 回答
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
于 2013-04-19T20:59:33.553 回答
1

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

var isNumber = ( +n === parseFloat(n) );
于 2013-04-19T21:12:24.337 回答