我读过其他关于简单算术表达式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