用于简单算术表达式的正则表达式



我读过其他关于简单算术表达式regex的stackoverflow帖子,但没有一个是与我的问题:

我需要验证这种表达式:"12+5.6-3.51-1.06"

我试着

const mathre = /(d+(.)?d*)([+-])?(d+(.)?d*)*/;
console.log("12+5.6-3.51-1.06".match(mathre));

但结果是'12+5',我不明白为什么?

您只获得12.5作为匹配,因为没有/g全局标志,但是如果您启用全局标志,它将给出部分匹配,因为在验证整个字符串的模式中没有锚点^$

[+-]只匹配一次,应该多次重复匹配。

当前模式将匹配1+2+3,但它也将匹配1a1+2b2,因为点没有转义,并且可以匹配任何字符(使用.逐字匹配)。

从数字和可选的小数部分开始,并重复+-1次或多次:

^d+(?:.d+)?(?:[-+]d+(?:.d+)?)+$

Regex演示

如果值可以以可选的加号和减号开始,也可以是不带前导数字的小数:

^[+-]?d*.?d+(?:[-+][+-]?d*.?d+)+$
  • ^起始字符串
  • [+-]?可选+-
  • d*.d+匹配*+数字与可选.和1+数字
  • (?:非捕获组
    • [-+]匹配+-
    • [+-]?d*.d+匹配可选的+-0+数字和可选的.和1+数字
  • )+关闭非捕获组并重复1+次以匹配至少一个+-
  • $字符串结束

Regex演示

您可以尝试将此解决方案用于PCRE兼容的RegExp引擎:

^(?:(-?d+(?:[.,]{1}d)?)[+-]?)*(?1)$
  • ^起始字符串
  • (?:非捕获组ng1
  • (-?d+(?:[.,]{1}d)?)带或不带开头的数字模式"产生绯闻;还有" "或",";在中间,匹配1或1.1或1,1(配对组1)
  • [+-]?"+"或";产生绯闻;
  • )*表示组ng1可能会重复0次或更多次
  • (?1)这么说它必须是引用第一个子模式
  • 的模式末尾的一个数字。
  • $字符串结束

由于JS不支持递归引用,您可以使用完整版本:

/^(?:(-?d+(?:[.,]{1}d)?)[+-]?)*(-?d+(?:[.,]{1}d)?)$/gm

最新更新