我使用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 )
答案 0 :(得分:1)
我认为仅使用正则表达式来解析像"(-2+4*-(3.5--8))"
这样的复杂情况是不可能的,特别是考虑到我们在javascript中没有负面看法。
解决方案是通过在分隔符和无符号表达式之间合并符号来对匹配数组进行后处理。
在我看来,正则表达式在这里很有用,但仅适用于主要的标记化。因为您将构建二进制表达式树(或您选择的任何其他正式表示),所以大部分工作都将在您之前。
答案 1 :(得分:0)
不幸的是,如果您要解决的是解析数学表达式,则无法使用正则表达式。
RegExps可用于Regular Grammars可描述的语言,而算术表达式则不能,它们由Context Free Grammar(CFG)描述。如果你想解析,也许解释结果,你肯定需要一些堆叠状态机。
你可以看一下众所周知的algorithm。
希望这有帮助。
答案 2 :(得分:0)
您可以为数字添加一个可选符号,该符号适用于您的示例:
var STRING = ST.match(/-?\d*\.\d+|-?\d+|[()/*+-]/g);
但是,这也会将减号运算符变为符号。表达式(4-2)
会为您提供{ "(", "4", "-2", ")" }
。
此外,它会愉快地“解析”+---((((***
之类的表达而不会抱怨。如果你想要一个有意义的结果,你应该将它解析为真实的,而不仅仅是用正则表达式将它拆分。
答案 3 :(得分:0)
我认为你的RegExp中有一些错误试试这个,它对我有用:
var STRING = ST.match(/(\d*)(\.)(\d+)|(\d+)|[()\/*+-]/g);