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

Javascript 根据运算顺序求指数运算的极限,javascript,regex,Javascript,Regex,我有一个包含等式的字符串。我需要检查字符串,试图找到一个指数,然后根据运算顺序找到该表达式的极限。我真的不知道如何解释它,所以这里有一些字符串和预期输出来说明我的目标: 2*(3+4):无匹配项(无指数) 2^5:整个字符串是指数运算 4^7-6:查找4^7 5+6^3:只需查找6^3 (5+6)^3:整个字符串是指数的一部分 (6+-4)^8:整个字符串是指数的一部分,包括负数 这些数字中的任何一个也可以是单个字母变量,例如“x”。任何一边都可能有任何数学运算,所以找到我想要的(我知道的)

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

  • 2*(3+4)
    :无匹配项(无指数)
  • 2^5
    :整个字符串是指数运算
  • 4^7-6
    :查找
    4^7
  • 5+6^3
    :只需查找
    6^3
  • (5+6)^3
    :整个字符串是指数的一部分
  • (6+-4)^8
    :整个字符串是指数的一部分,包括负数
这些数字中的任何一个也可以是单个字母变量,例如“x”。任何一边都可能有任何数学运算,所以找到我想要的(我知道的)部分的唯一方法是匹配一个数字或一对括号。我更喜欢使用正则表达式,但简单的字符串操作也可以。我在想这样的事情(正则表达式):
[0-9a-z\.]\^[0-9a-z\.]
但这不适用于可能的负号,也不允许对括号之类的符号进行分组(为此,您需要确保只有匹配对)。在其他一些情况下,我的上述尝试将失败


那么最好的方法是什么呢?我不知道如何用正则表达式捕捉每一个案例,也不知道如何用纯JS处理所有的可能性。

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

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

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

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

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

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

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

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

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

-?(?:[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+
    |
  • \([^()]+\)
    一组括号
  • \^
    匹配求幂运算符
  • 电源的右侧与我们在左侧允许的相同类型的令牌匹配
选项2:
x^y^z..

如果要允许
x^y^z..
,请修改正则表达式,如下所示:

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

如果你的意见与你提到的一致,我建议如下:

-?(?:[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+
    |
  • \([^()]+\)
    一组括号
  • \^
    匹配求幂运算符
  • 电源的右侧与我们在左侧允许的相同类型的令牌匹配
选项2:
x^y^z..

如果要允许
x^y^z..
,请修改正则表达式,如下所示:

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

如果你的意见与你提到的一致,我建议如下:

-?(?:[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+
    |
  • \([^()]+\)
    一组括号
  • \^
    匹配求幂运算符
  • 电源的右侧与我们在左侧允许的相同类型的令牌匹配
选项2:
x^y^z..

如果要允许
x^y^z..
,请修改正则表达式,如下所示:

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

如果你的意见与你提到的一致,我建议如下:

-?(?:[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+
    |
  • \([^()]+\)
    一组括号
  • \^
    匹配求幂运算符
  • 电源的右侧与我们在左侧允许的相同类型的令牌匹配
选项2:
x^y^z..

如果要允许
x^y^z..
,请修改正则表达式,如下所示:

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

数学表达式的语言不是一种规则语言。你需要