1

例:

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))+\))+)\)@

それらを「組み合わせる」方法がわかりません-除算バランスのとれた括弧を処理する単一の正規表現を記述します。

4

2 に答える 2

1

私はこのようなものがうまくいくはずだと思います:

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

さて、これはおそらく完璧ではありませんが、アイデアは次のとおりです。

最初のグループ $1 は((?:\w+|\((?1)\))(?:[+*^-](?1)|!)?)、次のとおりです。

(リテラル)または(括弧で囲まれたバランスの取れた式) の後に、オプションの演算子と、必要に応じて別のバランスのとれた式が続きます。
そのように書くと(?1)、正規表現のどこでも使用して、別のバランスの取れた式を参照できます。

作業例: http://ideone.com/PNLOD

于 2011-01-17T21:01:49.560 に答える
0

あなたがすでに正規表現を受け入れていることは知っていますが、あなたがやろうとしていることに対する本当の答えは適切なパーサーです...そしていいえ、これをゼロからコーディングしたり、車輪を再発明したりする必要はありません. 多くの人が phpclasses を嫌っていますが、そこにあるevalMathクラスは、数式の解析と評価に非常に役立ちます。使用方法と拡張方法の詳細については、同様の質問に対する私の回答を参照してください。

于 2011-01-17T21:59:10.127 に答える