javascript - 如何编写正则表达式从字符串方程中拆分两个连续的数学运算符( "/-"、 "*-")?

标签 javascript reactjs

我正在尝试解决需要将字符串方程式转换为数字和运算符数组的问题。但我做不到。

我编写的用于将字符串方程式转换为数组的正则表达式。

Input: '1+2-33/45*78'.split(/([\\+\-\\*\\/]+)/)

Output: ["1", "+", "2", "-", "33", "/", "45", "*", "78"]

但是当你有两个连续的运算符 - (*-) 时,上面的正则表达式并不适用。有关更多说明,请参见下文。

Input: '1+2-33/-45*-78'.split(/([\\+\-\\*\\/]+)/)

Output: ["1", "+", "2", "-", "33", "/-", "45", "*-", "78"]

我期待如下输出。

输入:'1+2-33/-45*-78'

输出:["1", "+", "2", "-", "33", "/", "-45", "*", "-78"]

编辑:我在 stackOverflow 上查找了所有答案,但它们没有解决我上面描述的问题。

Stackoverflow 答案将像这样求解这个等式:这个字符串 '7/-2*-9-8' 将被转换为 ["7", "/-", "2", "*-", "9", "-", "8"]

注意上面的两个连续运算符["/-", "*-"]

但这不是我要找的。我期待的输出是这样的:

预期答案: ["7", "/", "-2", "*", "-9", "-", "8]

所以如果有这样的'7/-2*-9-8'。请注意,我这里有连续的运算符(“/-”或“*-”)。然后我想在数字本身中包含负号

stackoverflow 中的所有答案都没有解决这个问题。请重新打开问题。谢谢!

原因:我正在尝试实现一个仅使用 (+,/, -, *) 运算符的简单计算器。我希望这能消除一些疑问。

最佳答案

我同意其他用户的意见,您不应该使用正则表达式进行表达式解析,有许多库可以更好地处理所有极端情况。话虽如此,您当然可以构建一个正则表达式来处理您问题中概述的简单表达式。

首先让我们构建一个正则表达式,当它们前面有 */(正后视)时捕获数字(及其符号):

(?<=[/*])([+-]?\d+)

然后我们就可以抓取符号了:

([/*+-])

最后捕获剩余的数字(没有符号):

(\d+)

现在我们可以组合各种正则表达式片段来形成我们简单的表达式解析器:

(?<=[/*])([+-]?\d+)|([/*+-])|(\d+)

这个解决方案当然不是万无一失的,当有空格并且不处理括号时它会崩溃,但给出示例输入它会按预期工作。


var expression = '1+2-33/-45*-78'.match(/(?<=[/*])([+-]?\d+)|([/*+-])|(\d+)/g);
console.log(expression);

关于javascript - 如何编写正则表达式从字符串方程中拆分两个连续的数学运算符( "/-"、 "*-")?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56978621/

相关文章:

c# - 根据 Checkbox 选中的数据做 Ajax 调用

javascript - 防止双击被解释为两次单击?

javascript - babeljs 在 renderDetails() 方法的 </type> 中抛出 'unterminated regular expression'

android - 使用react-navigation在屏幕之间导航

javascript - 如何在 javascript 中检测 bool 值 true 和 false?

javascript - 为什么我得到的是未定义的而不是选定的值?

javascript - 调整fabricjs矩形的宽度/高度属性

javascript - AngularJS 中的动态路由问题

javascript - zoom : browser renders a space gap between containers while zooming, 上有趣的 Css 渲染问题出现在每个浏览器中,但不会出现在 Firefox 中

javascript - React Hooks react-hooks/exhaustive-deps eslint 规则似乎过于敏感