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

时间:2019-03-16 16:14:51

标签: php regex preg-match

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

  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\^\+\-\*\/]*\)?))?)

2 个答案:

答案 0 :(得分:0)

几个小时后找到解决方案,这是我得到的:

我写下正则表达式以匹配(*),(/),(*-)或(/-)之类的操作。

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

在那之后,我进行了正则表达式,以在最括号内找到与条件匹配的因子及其最接近的后变量。

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

如果不匹配,请再试一次以找到最符合条件的方括号及其最前面的变量。

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

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

DEMO

已更新

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

DEMO

答案 1 :(得分:0)

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

之前

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

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

之后,快两倍,一半大:

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

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

enter image description here