首先,关于数学表达式的正则表达式有很多很多问题,如果我忽略了一个已经回答这个问题的人,抱歉。虽然这源于解析一个数学表达式(没有eval
...),但更多的是关于&#34;这可以通过一个棘手的正则表达式或类似方法完成吗?&#34;。< / p>
有没有办法在单个"-5.42+2--3*-5.5/-2+-4"
[1]中将包含["-5.42", "+", "2", "-", "-3", "*", "-5.5", "/", "-2", "+", "-4"]
等数学表达式的字符串拆分为.split
? Else说,拆分二元运算符(/[+*/]|(?<!^|[+\-*/])-/
,看起来就是问题)和它们的参数(/-?\d+(\.\d+)?/
)。一元减号每个数字最多出现一次,即无---
。这一步没有支撑。
我看到它的方式,没有后瞻性,不可能将{1} {一号-
与二元-
区分开split
(预期答案)的约束。但是,也许有一个技巧可以获得相同的结果,而不是后顾之忧。我经常对棘手的正则表达式解决方法感到惊讶,以至于相信我的直觉。
通过多个操作,这里有多种方式的一种方式(请注意,第一个正则表达式替换在某种程度上模拟了一个lookbehind):
console.log("-5.42+2--3*-5.5/-2+-4"
.replace(/^-|([+\-*/])-/g, "$1#")
.split(/([+\-*/])/)
.map(e => e.replace("#", "-"))
);
&#13;
另一种选择是反转字符串,然后使用lookahead,然后再次反转结果。
[1] 我会在这里添加(or operation)
,但问题是&#34;操作&#34;会立即出现并彻底破坏这个话题。同样,(or in a beautiful way)
也是基于意见的。但是,我想,例如关于使用repeated parenthesized matches,这在javascript中是不可能的,但与split
非常相似。
答案 0 :(得分:1)
简答:
只有正则表达式,你才能做你想做的事。您必须使用Parsing expression grammar (PEG)
答案很长
根据您所看到的,数学表达式只包含term
和operator
s。
但事实上,它比这更复杂。因为term
和特定operator
的组合将具有比其他term
更高的优先级。
因此,我们不仅要关注operator
和a term = a number or an expression
,还要注意:
an unary = positive value or negative value of a term
a multiple = an unary [multiply or divide to another unary]{0 times or more}
a sum = a multiple [add or subtract to another multiple]{0 times or more}
an expression = a sum
parenthese
这是+ - * / only表达式的声明。包含and
,or
运算符,not null
运算符等的更复杂的表达式将具有更复杂的声明。你别无选择,只能使用PEG。
所以,试试PEGjs here。它有一个简单表达式的演示,例如&#34; 2 *(3 + 4)&#34;实施。
确定你可以从表达式中提取任何你想要的东西。
答案 1 :(得分:-2)
拆分运营商有什么问题?
.split(/(?=[-+*/()])/);