根据运算顺序求指数运算的极限



我有一个包含方程的字符串。我需要检查字符串,试着找到一个指数,然后根据运算顺序找到表达式的极限。我真的不知道如何解释它,所以这里有一些字符串和预期的输出来演示我的目标:

  • 2*(3+4): No matches (No exponent)
  • 2^5:整个字符串为指数运算
  • 4^7-6:查找4^7
  • 5+6^3: Just find 6^3
  • (5+6)^3:整个字符串是指数
  • 的一部分
  • (6+-4)^8:整个字符串是指数的一部分,包括负数

这些数字中的任何一个也可以是单个字母变量,例如'x'。两边可能有任何数学运算,所以找到我想要的部分(我知道的)的唯一方法是匹配一个数字或一对括号。我更喜欢使用正则表达式,但普通的字符串操作也很好。我在想这样的东西(正则表达式):[0-9a-z.]^[0-9a-z.]但这不能容纳可能的负号,也不允许像括号这样的分组符号(为此,您需要确保只有匹配的对)。还有一些其他的情况,我的上述尝试会失败。

那么最好的方法是什么呢?我不知道如何用正则表达式捕获每种情况的专业知识,也不知道如何处理纯JS的所有可能性。

如果您的输入符合您所提到的,我建议这样做:

-?(?:[a-z]+|d+|([^()]+))^-?(?:[a-z]+|d+|([^()]+))

样本匹配:

-2^3
2^3
2^(a/b)
(a+b)^7 
(a+b)^(d/c)
(5+6)^3

查看演示中的匹配。

  • 在你的代码中,通过设置i标志
  • 使其不区分大小写请注意,JavaScript不支持递归,所以我们遇到了嵌套括号的麻烦,如2^(3-(2/x))

  • -?允许一个可选的减号
  • (?:[a-z]+|d+|([^()]+))匹配由字母[a-z]+组成的变量…或"|"
  • 数字d+|
  • ([^()]+))一组括号
  • ^匹配求幂运算符
  • 右边的power匹配与左边
  • 相同类型的token

选项2:x^y^z...

如果你想允许x^y^z...,修改正则表达式如下:

-?(?:[a-z]+|d+|([^()]+))(?:^-?(?:[a-z]+|d+|([^()]+)))+

数学表达式的语言不是一种规则语言。您需要编写某种类型的解析器,而不是依赖于正则表达式。

您可以尝试下面的正则表达式,只得到指数部分,

[a-z0-9]+(?:^[a-z0-9]+)+|([a-z0-9]+[-+*/]+[a-z0-9]+)^(?:[a-z0-9]+|([a-z0-9]+[-+*/]+[a-z0-9]+))
演示

最新更新