首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >按操作顺序求指数运算的极限

按操作顺序求指数运算的极限
EN

Stack Overflow用户
提问于 2014-07-13 05:04:10
回答 3查看 35关注 0票数 0

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

  • 2*(3+4):没有匹配(没有指数)
  • 2^5:整个字符串是指数运算
  • 4^7-6:找到4^7
  • 5+6^3:只要找到6^3
  • (5+6)^3:整个字符串是指数的一部分
  • (6+-4)^8:整个字符串是指数的一部分,包括负数。

这些数字中的任何一个也可以是一个字母变量,例如'x‘。两边都可能有任何数学运算,所以要找到我想要的部分(据我所知),唯一的方法就是匹配一个数字或一对括号。我更喜欢使用regex,但是简单的字符串操作也可以。我正在考虑这样的事情(regex):[0-9a-z\.]\^[0-9a-z\.],但这不适合可能的负号,也不允许分组符号,如括号(为此,您需要确保只有匹配的对)。在其他一些情况下,我的上述尝试也会失败。

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-07-13 05:09:20

如果你的意见与你所说的相符,我建议如下:

代码语言:javascript
运行
复制
-?(?:[a-z]+|\d+|\([^()]+\))\^-?(?:[a-z]+|\d+|\([^()]+\))

示例匹配:

代码语言:javascript
运行
复制
-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]+组成的变量..。或“\x{e76f}
  • 数字\d+|
  • \([^()]+\))一组圆括号
  • \^与指数运算符匹配
  • 电源的右侧与我们在左边允许的相同类型的令牌匹配。

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

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

代码语言:javascript
运行
复制
-?(?:[a-z]+|\d+|\([^()]+\))(?:\^-?(?:[a-z]+|\d+|\([^()]+\)))+
票数 1
EN

Stack Overflow用户

发布于 2014-07-13 05:08:47

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

代码语言:javascript
运行
复制
[a-z0-9]+(?:\^[a-z0-9]+)+|\([a-z0-9]+[-+*/]+[a-z0-9]+\)\^(?:[a-z0-9]+|\([a-z0-9]+[-+*/]+[a-z0-9]+\))

演示

票数 1
EN

Stack Overflow用户

发布于 2014-07-13 05:14:57

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24719715

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档