根据操作顺序查找指数运算的限制

时间:2014-07-13 05:04:10

标签: javascript regex

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

  • 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来处理所有可能性。

3 个答案:

答案 0 :(得分:1)

您可以尝试使用以下正则表达式来获取指数部分

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

DEMO

答案 1 :(得分:1)

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

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

示例匹配:

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

查看the demo中的匹配项。

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

<强>解释

  • -?允许使用可选的减号
  • (?:[a-z]+|\d+|\([^()]+\))匹配由字母[a-z]+ ... OR'|`
  • 组成的变量
  • 数字\d+|
  • \([^()]+\))一组括号
  • \^与指数运算符匹配
  • 权力的右侧与左边允许的同类令牌相匹配

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

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

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

答案 2 :(得分:1)

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