我正在尝试在 JavaScript 中使用正则表达式来匹配数字或包含小数的数字。正则表达式看起来像[0-9]+ | [0-9]* \. [0-9]+
.
但是,由于某种原因,这'1A'.match(/^[0-9]+|[0-9]*\.[0-9]+$/)
会错误地找到匹配项。我不确定表达式的哪一部分与A
.
我正在尝试在 JavaScript 中使用正则表达式来匹配数字或包含小数的数字。正则表达式看起来像[0-9]+ | [0-9]* \. [0-9]+
.
但是,由于某种原因,这'1A'.match(/^[0-9]+|[0-9]*\.[0-9]+$/)
会错误地找到匹配项。我不确定表达式的哪一部分与A
.
问题是你的交替。这就是它所说的:
^[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+$/
'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
也许我在错误的地方,但是如果您仅使用正则表达式来验证数值,为什么不使用更快的替代方法,如下所示:
var isNumber = ( +n === parseFloat(n) );