【问题标题】:RegEx to match only numbers incorrectly matching正则表达式仅匹配不正确匹配的数字
【发布时间】:2013-04-19 20:56:01
【问题描述】:

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

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

【问题讨论】:

  • '1A'.match(/^([0-9]+|[0-9]*\.[0-9]+)$/) 分组
  • 看起来可以由 'parseFloat' 处理而无需正则表达式
  • 你为什么需要它?那是为了验证输入还是什么?
  • 我正在编写一个基于w3.org/TR/css3-syntax/#tokenization的CSS3分词器。

标签: javascript regex numbers match


【解决方案1】:

问题是你的轮换。它是这样说的:

  ^[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 很好的解释,你在这么短的时间内输入了这么多:)
  • 我不知道?:。 +1
  • OP 期望通过字符串“1.24a”得到什么?
  • @Xotic750 不匹配,我想
  • 您可以简单地执行/^\d+$/ 以仅匹配数字(不为空)
【解决方案2】:

'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

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

    • 永远不会返回 true,因为它是在比较数字和字符串,对吗?也许如果你让那两个==。但是parseFloat 接受科学的e 表示法,不是吗?这不是规范的一部分。无论如何,总体上是好的想法
    • @m.buettner 是的,如果n 是字符串类型,那么+n 应该可以解决问题。
    猜你喜欢
    • 1970-01-01
    • 2011-04-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-27
    • 2012-12-22
    • 1970-01-01
    相关资源
    最近更新 更多