正则表达式:匹配数学方程中两个因素之间的操作

Regex: match an operation between two factors in mathematical equation

我想制作一个正则表达式来匹配可能包含幂符号 (^) 的数学方程式中的乘法或除法运算。匹配从最括号内的因子与其附近的变量开始。我已经创建了自己的正则表达式,但我遇到了两个主要问题:

  1. 它不匹配它们之间不包含 * 符号的两个因子(参见示例 2),我希望它匹配。
  2. 它匹配只包含-符号的操作(示例4),我希望它没有,除了-之前有*/符号符号(示例 3)。

这是我的实验:

示例 1

String:

(sdf^sdf*(sdf*(23^3s)))*sdf

Expected result:

(sdf*(23^3s))

My current result:

(sdf*(23^3s))

示例 2

String

(232^23)dfdf+dfd(sfsf)

Expected Result

(232^23)dfdf

My current result:

(doesn't match at all)

示例 3

String

dfd(sfsf^sdf+323)/-13+sfdfsdf

Expected Result (UPDATED)

dfd(sfsf^sdf+323)

My current result

(sfsf^sdf+323)/-13

示例 4

String

(dfd^23sdf)-(234^dfd)

Expected Result

(doesn't match anything)

My current result

(dfd^23sdf)-(234^dfd)

示例 5

String

(dfd^23sdf)-(234^dfd)*(x-3)

Expected Result

(234^dfd)*(x-3)

My current result

(dfd^23sdf)-(234^dfd)*(x-3)

这是我的正则表达式:

(\-?)\(?(((\-?)\-?\d*\.?\d*[a-z]*\^?)+)\)?(\*?\/?)((\-?)\(([^\(\)]+)\))(\*?\/?)(\-?)\(?(((\-?)\-?\d*\.?\d*[a-z]*\^?)+)\)|(((\-?)\(([^\(\)]+)\))([\*\/])(\-?)(((?!\+)(\-?)\(?[\-\d\.\w\^\+\-\*\/]*\)?))?)

经过几个小时的寻找解决方案后,我得到了以下结果:

我写下正则表达式以匹配 (*)、(/)、(*-) 或 (/-) 等操作。

(((\/)(?!\-))|((\*)(?!\-))|(\/\-)|(\*\-))?

之后,我制作了一个正则表达式来查找最括号内的因子及其最接近的后变量。

(((\w+\^\(.*?\)|([\w\^]+))|(\(?\(([^\(\)]+)\)\)?))(((\/)(?!\-))|((\*)(?!\-))|(\/\-)|(\*\-))?\(([^\(\)]+)\))

如果不匹配,则重新尝试找到符合条件的括号内最接近的因子及其最前面的变量。

(\(([^\(\)]+)\)((((\/)(?!\-))|((\*)(?!\-))|(\/\-)|(\*\-))?((\w+\^\(.*?\)|([\w\^]+))|(\(?\(([^\(\)]+)\)\)?))))

然后,使用 OR (|) 量词组合上面的两个正则表达式以获得所需的结果。

DEMO

已更新

我修改了一些部分,所以它可以匹配负因子和小数(用'.'符号标记)。

DEMO

一个建议。如果你对正则表达式感到满意,你可以通过使所有组集群然后 运行 通过这里的正则表达式重构软件 http://www.regexformat.com

来加速它

之前:

https://regex101.com/r/5Wm1Eb/4

(\-?((\w+\.\^\(.*?\)|([\w\.\^]+))|(\(?\(([^\(\)]+)\)\)?))(((\/)(?!\-))|((\*)(?!\-))|(\/\-)|(\*\-))?\(([^\(\)]+)\))|(\-?\(([^\(\)]+)\)((((\/)(?!\-))|((\*)(?!\-))|(\/\-)|(\*\-))?((\w+\.\^\(.*?\)|([\w\.\^]+))|(\(?\(([^\(\)]+)\)\)?))))

后,速度翻倍,体积减半:

https://regex101.com/r/TbHlI1/1

\-?(?:(?:\w+\.\^\(.*?\)|[\w\.\^]+|\(?\([^\(\)]+\)\)?)(?:[*/](?:(?!\-)|\-))?\([^\(\)]+\)|\([^\(\)]+\)(?:[*/](?:(?!\-)|\-))?(?:\w+\.\^\(.*?\)|[\w\.\^]+|\(?\([^\(\)]+\)\)?))