正则表达式数学表达式分为一步

时间:2017-08-16 17:33:00

标签: javascript regex

首先,关于数学表达式的正则表达式有很多很多问题,如果我忽略了一个已经回答这个问题的人,抱歉。虽然这源于解析一个数学表达式(没有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):

&#13;
&#13;
console.log("-5.42+2--3*-5.5/-2+-4"
  .replace(/^-|([+\-*/])-/g, "$1#")
  .split(/([+\-*/])/)
  .map(e => e.replace("#", "-"))
);
&#13;
&#13;
&#13;

另一种选择是反转字符串,然后使用lookahead,然后再次反转结果。

[1] 我会在这里添加(or operation),但问题是&#34;操作&#34;会立即出现并彻底破坏这个话题。同样,(or in a beautiful way)也是基于意见的。但是,我想,例如关于使用repeated parenthesized matches,这在javascript中是不可能的,但与split非常相似。

2 个答案:

答案 0 :(得分:1)

简答:

只有正则表达式,你才能做你想做的事。您必须使用Parsing expression grammar (PEG)

答案很长

根据您所看到的,数学表达式只包含termoperator s。 但事实上,它比这更复杂。因为term和特定operator的组合将具有比其他term更高的优先级。 因此,我们不仅要关注operatora term = a number or an expression,还要注意:

  1. 首先我们声明an unary = positive value or negative value of a term
  2. 然后我们有a multiple = an unary [multiply or divide to another unary]{0 times or more}
  3. 然后我们有a sum = a multiple [add or subtract to another multiple]{0 times or more}
  4. 然后我们有an expression = a sum
  5. 最后,parenthese
  6. 这是+ - * / only表达式的声明。包含andor运算符,not null运算符等的更复杂的表达式将具有更复杂的声明。你别无选择,只能使用PEG。

    所以,试试PEGjs here。它有一个简单表达式的演示,例如&#34; 2 *(3 + 4)&#34;实施。

    确定你可以从表达式中提取任何你想要的东西。

答案 1 :(得分:-2)

拆分运营商有什么问题?

.split(/(?=[-+*/()])/);