javascript - JavaScript 正则表达式匹配数学表达式
问题描述
我需要这个正则表达式的帮助:
let j = numberArray.join("").match(/^([\d]*\.{1,}[\d]+|[\d]+)|([-+*/](?=\.|[\d]))|\.[\d]+|[\d]+/g);
这是我需要匹配的标准:
- 一个数字不能有多个小数。例如,只允许使用
.123
or等数字1.123
,但不允许使用...33
or1.2.3.3
。 - 一个运算符后面不能有一个或多个附加运算符。因此,用户不能连续输入 a
+
后跟 a*
。
此处输入和输出示例:
输入:..123+*/.4.3.5-+..3+123
将产生输出:.123/.435+.3+123
我实际上认为我已经设置了第二个标准(关于运营商),但我一直在努力解决小数点问题。我是正则表达式的新手,正在尽我所能破解这个,但现在它开始影响我了。任何帮助深表感谢!
解决方案
如果您单独执行这些操作,逻辑可能会更容易- 首先查找具有多个小数的数字,并修复它们以使其仅包含第一个小数位,然后找到重复的运算符,并用最终运算符替换它们:
const clean = str => str
// Match zero or more digits, followed by a decimal,
// followed by more digit and decimal characters
// For everything past the first decimal, replace decimals with the empty string
.replace(
/(\d*\.)([\d.]+)/g,
(_, g1, g2) => g1 + g2.replace(/\./g, '')
)
// Match 2 or more operators, capture the last operator in a group
// Replace with the last operator captured
.replace(
/([-+/*]){2,}/g,
'$1'
);
console.log(clean('..123+*/.4.3.5-+..3+123'));
推荐阅读
- html - 有没有办法让我的导航栏保持在右侧并在滚动时始终在页面顶部可见?
- javascript - 如何检测碰撞?
- javascript - 如何渲染一个
从 react-route-dom 使用对象而不是组件/函数 - ruby-on-rails - 在 Ruby 中使用 Amazon transcribe 流式转录
- docker - 如何将 dockerfile(并运行命令)重写为 docker-compose.yaml
- mysql - 以错误的排序规则连接到 mysql 服务器?
- python - 如何解决此“TypeError:序列项 0:预期的 str 实例,找到浮点数”
- python - 在 Anaconda 之外使用 Python 包
- c - 我得到了意想不到的输出
- angular - 在angular7中禁用以前日期的ng-bootstrap日期和时间