首页 > 解决方案 > Javascript 严格匹配和验证正则表达式

问题描述

我有

const int = /^[-+]?[1-9]+/
const float = /[+-]?([0-9]*[.])?[0-9]+/

// float return true for 

float.exec(1234)

// int return true for
// it matches only 4848
int.exec(4848.48)

如何仅匹配整数并且仅与相应的正则表达式匹配?

标签: javascriptnode.jsregexfloating-pointinteger

解决方案


将开始^和结束$分隔符添加到匹配整数的表达式中,使其不能仅匹配浮点数的一部分(请参阅此regex101):

^[-+]?[0-9]+$

请注意,您对整数的原始表达式不会匹配其中带有零的整数。

在浮点情况下,执行相同操作并移动该点,使其变为非可选(请参阅此regex101)。要匹配文字点,您还可以转义它而不是使用字符组,这样它就不会.意味着“任何字符”:

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

请注意,这将匹配:

  • 前导零,例如00100.2
  • 带有尾随零的浮点数,例如0.200000000
  • 显式加号, +123, +1.2,+.2
  • 有符号零:-0+0分别+0.0-0.0

如果您不想要前导零,可以使用( |) 来区分。对于整数(参见regex101):

^[-+]?(?:0|[1-9][0-9]*)$

对于浮点数,您需要将非捕获组设为可选,以便以文字点开头的数字仍然有效(请参阅regex101):

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

如果您想排除有符号零,这取决于您询问的对象在 math 中存在或不存在,但在大多数编程语言中是可分配的,您可以将可选符号移动到or的第二个条件中。对于整数(参见regex101):

^(?:0|[-+]?[1-9][0-9]*)$

对于浮动,这更棘手。如果您再次将符号移动到or的第二个条件中,您将不会匹配+0.0and -0.0,但您也不会匹配以文字点 or 开头的有符号数字0.,因此这将不起作用(请参阅regex101)。

为了解决这个问题,您可以将整个事情包装在另一个条件中,或者在第二个条件中添加一个否定的前瞻,以明确区分0.0和其他条件0.(参见regex101):

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

最后,如果您想断言该数字不以尾随零结尾,请在行(?<![0-9]0)尾之后的最后添加一个适当的负向后查找$(请参阅regex101):

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

顺便说一句,您也可以使用\d代替[0-9].

请注意,在 javascript 中,exec()调用可能与评估为 的浮点参数不匹配0,因为这发生在评估exec()(参见jsfiddle)之前:

const float = /^[+-]?(?:0|[1-9]\d*)?\.\d+$/ // floats with no leading zeros

console.log(float.exec(0.0))      // null
console.log(float.exec(0.0000))   // null
console.log(float.exec(+0.0))     // null
console.log(float.exec(-0.0))     // null
console.log(float.exec('0.0'))    // ["0.0"]
console.log(float.exec('0.0000')) // ["0.0000"]
console.log(float.exec('+0.0'))   // ["+0.0"]
console.log(float.exec('-0.0'))   // ["-0.0"]

推荐阅读