我想制作一个正则表达式来匹配数学方程中的乘法或除法运算,它可能包含幂符号(^
)。匹配在最括号内的因子与其附近变量之间开始。我创建了自己的正则表达式,但我面临两个主要问题:
*
符号的因子(参见示例2),我希望它匹配。-
符号的操作(示例4),我希望它不会在*
符号之前有/
或-
符号(示例3)。这是我的实验:
例1
串:
(sdf^sdf*(sdf*(23^3s)))*sdf
预期结果:
(sdf*(23^3s))
我目前的结果:
(sdf*(23^3s))
例2
串
(232^23)dfdf+dfd(sfsf)
预期结果
(232^23)dfdf
我目前的结果:
(根本不匹配)
例3
串
dfd(sfsf^sdf+323)/-13+sfdfsdf
预期结果(更新)
dfd(sfsf^sdf+323)
我目前的结果
(sfsf^sdf+323)/-13
例4
串
(dfd^23sdf)-(234^dfd)
预期结果
(与任何东西都不匹配)
我目前的结果
(dfd^23sdf)-(234^dfd)
例5
串
(dfd^23sdf)-(234^dfd)*(x-3)
预期结果
(234^dfd)*(x-3)
我目前的结果
(dfd^23sdf)-(234^dfd)*(x-3)
这是我的正则表达式:
(\-?)\(?(((\-?)\-?\d*\.?\d*[a-z]*\^?)+)\)?(\*?\/?)((\-?)\(([^\(\)]+)\))(\*?\/?)(\-?)\(?(((\-?)\-?\d*\.?\d*[a-z]*\^?)+)\)|(((\-?)\(([^\(\)]+)\))([\*\/])(\-?)(((?!\+)(\-?)\(?[\-\d\.\w\^\+\-\*\/]*\)?))?)
经过几个小时的寻找解决方案,这就是我得到的:
我写下正则表达式来匹配像(*),(/),(* - )或(/ - )这样的操作。
(((\/)(?!\-))|((\*)(?!\-))|(\/\-)|(\*\-))?
之后,我创建一个正则表达式,找到最大括号内的因子及其最接近的变量,它与条件匹配。
(((\w+\^\(.*?\)|([\w\^]+))|(\(?\(([^\(\)]+)\)\)?))(((\/)(?!\-))|((\*)(?!\-))|(\/\-)|(\*\-))?\(([^\(\)]+)\))
如果它不匹配,则再次尝试找到最大括号内的因子及其与条件匹配的最接近的前变量。
(\(([^\(\)]+)\)((((\/)(?!\-))|((\*)(?!\-))|(\/\-)|(\*\-))?((\w+\^\(.*?\)|([\w\^]+))|(\(?\(([^\(\)]+)\)\)?))))
然后,使用OR(|)量词将上述两个正则表达式组合起来以获得所需的结果。
更新
我修改了一些部分,因此它可以匹配负因子和十进制(用'。'符号标记)。