3

我使用 match 将数学表达式拆分为单独的字符串并将它们保存在数组中。

var STRING = ST.match(/\d*\.\d+|\d+|[()/*+-]/g);

但是这种方法将所有内容分开,包括括号内的负数。例如 (-2+4) 不会给我 -2,而是将 - 保存在 STRING 数组的一个索引中,并将 2 保存在下一个索引中。无论如何使用匹配并保存括号中的负数?

这就是我想要的:(-2+4):

STRING[0] give me (
STRING[1] give me -2
STRING[2] give me +
STRING[3] give me 4
STRING[4] give me )

如果没有负数正常工作:(2+4):

STRING[0] give me (
STRING[1] give me 2
STRING[2] give me +
STRING[3] give me 4
STRING[4] give me ) 
4

4 回答 4

2

我认为不可能解析像"(-2+4*-(3.5--8))"正则表达式这样的复杂案例,特别是考虑到我们在 javascript 中没有负面的看法。

一种解决方案是通过在分隔符和无符号表达式之间合并符号来对匹配数组进行后处理。

在我看来,正则表达式在这里很有用,但仅用于主要标记化。随着您将构建二叉表达式树(或您选择的任何其他正式表示),大部分工作都将在您面前完成。

于 2013-02-20T07:46:12.380 回答
0

不幸的是,如果您尝试解析数学表达式,则不能使用正则表达式。

RegExps 可用于正则文法可描述的语言,而算术表达式则不能,它们由上下文无关文法 ( CFG ) 描述。如果你想解析,也许解释结果,你肯定需要一些堆叠状态机。

你可以看看这个众所周知的算法

希望这可以帮助。

于 2013-02-20T07:57:09.247 回答
0

您可以在数字上添加一个可选符号,这将适用于您的示例:

var STRING = ST.match(/-?\d*\.\d+|-?\d+|[()/*+-]/g);

但是,这也会将减号运算符变成符号。表达式(4-2)会给你{ "(", "4", "-2", ")" }

此外,它会愉快地“解析”一个表达式,就像+---((((***没有抱怨一样。如果您想要一个有意义的结果,您应该真正解析它,而不仅仅是用正则表达式拆分它。

于 2013-02-20T07:58:50.250 回答
0

我认为你的 RegExp 有一些错误试试这个,它对我有用:

var STRING = ST.match(/(\d*)(\.)(\d+)|(\d+)|[()\/*+-]/g);
于 2013-02-20T08:27:40.140 回答