我试图在JavaScript中使用正则表达式来匹配包含小数的数字或数字。正则表达式看起来像[0-9]+ | [0-9]* \. [0-9]+
。
但是,由于某些原因,此'1A'.match(/^[0-9]+|[0-9]*\.[0-9]+$/)
错误地找到匹配项。我不确定表达式的哪一部分与A
匹配。
答案 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) );