正则表达式:匹配数学方程中两个因子之间的运算

问题描述 投票:-1回答:1

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

  1. 它不匹配两个不包含*符号的因子(参见示例2),我希望它匹配。
  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\^\+\-\*\/]*\)?))?)
php regex preg-match
1个回答
0
投票

经过几个小时的寻找解决方案,这就是我得到的:

我写下正则表达式来匹配像(*),(/),(* - )或(/ - )这样的操作。

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

之后,我创建一个正则表达式,找到最大括号内的因子及其最接近的变量,它与条件匹配。

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

如果它不匹配,则再次尝试找到最大括号内的因子及其与条件匹配的最接近的前变量。

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

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

DEMO

更新

我修改了一些部分,因此它可以匹配负因子和十进制(用'。'符号标记)。

DEMO

© www.soinside.com 2019 - 2024. All rights reserved.