匹配括号与分区运算符 - 正则表达式

时间:2011-01-17 20:01:41

标签: php regex pcre recursive-regex

示例:

input: (n!/(1+n))
output: frac{n!}{1+n}

input: ((n+11)!/(n-k)^(-1))
output: frac{(n+11)!}{(n-k)^(-1)}

input: (9/10)
output: frac{9}{10}

input: ((n+11)!/(n-k)^(-1))+(11)/(2)
output: frac{(n+11)!}{(n-k)^(-1)}+(11)/(2)

如果没有子括号,则以下正则表达式可用。

\(([^\/\)]*)\/([^\)]*)\)

以下匹配括号

@\((([^()]++|\((?:[^()]++|(?R))+\))+)\)@

我无法弄清楚如何“组合”它们 - 编写一个正则表达式来处理除法平衡括号。

2 个答案:

答案 0 :(得分:0)

我认为这样的事情应该有效:

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

现在,这可能并不完美,但这就是想法:

第一组$ 1是((?:\w+|\((?1)\))(?:[+*^-](?1)|!)?),即:

(A 文字(括号中包含平衡表达式),后跟可选运算符如果需要,另一个平衡的表达 以这种方式编写,我们可以在正则表达式中的任何位置使用(?1)来引用另一个平衡表达式。

工作示例:http://ideone.com/PNLOD

答案 1 :(得分:0)

我知道你已经接受了一个正则表达式,但你正在尝试做的真正答案是一个正确的解析器......不,你不需要从头开始编码或重新发明轮子。虽然很多人讨厌phpclasses,但是你可以找到的evalMath类对解析和评估数学公式非常有用。请参阅我对similar question的回答,了解如何使用和扩展它的详细信息。