2011-01-17 10 views
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))+\))+)\)@ 

は - 分裂バランスの取れた括弧を処理するための単一の正規表現を記述します。

+3

正規表現は、複雑な解析に適したツールではありません。特に、平衡テキストと一致する必要がある場合は、*特に*です。いくつかの正規表現の亜種が提供する拡張機能を使って、何かのハックを並べ替えることができますが、実際にこの種のものに実際のパーサを使用したいと思っています。 –

+1

事は、私はとても近いです。私はパーサーについて何も知らないので、実装するのにはもっと時間がかかります。私はそれが正規表現で可能であり、それが最も簡単な方法であることを私は知っています。 – SamB

+0

私は少なくとも*テストケースのために働いている答えを追加しました。自由に変更してもかまいません。完璧ではありません(所有量を追加することもできますし、勇気があれば単項 '+'を追加することもできます)。その最大の問題は、 'a + 2/3 + b' - >'(a + 2)/(3 + b) 'のように、すべての'/'を小数として扱うことです。 – Kobi

答えて

0

私はこのような何かが動作するはずだと思う:

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

は今、これはおそらく、完璧ではないが、ここでアイデアです:

最初のグループ、$ 1、((?:\w+|\((?1)\))(?:[+*^-](?1)|!)?)で、ある:

リテラル又は続く(括弧に包まバランス式) オプションのオペレータと、必要に応じて別のバランスの取れた式。
このように書くと、正規表現のどこにでも(?1)を使用して、別の平衡式を参照することができます。

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

+0

これまでの作業に感謝します。私はカッコ内に区切記号がある場合にのみこれを動作させる必要があります。これは十分に近いですが、私はここからそれを理解することができます。ありがとう! – SamB

+0

@SamB - 問題ありません!ちなみに興味深い質問ですが、入出力の例は非常に明確です。あなたが正しいです、私は外側のかっこを見逃しましたが、それは実行可能だと思います。 – Kobi

0

私はあなたがすでに正規表現を受け入れてきたけど、あなたが何をしようとしての本当の答えが正しいパーサーです...といや、あなたがする必要はありませんこれをゼロからコード化するか、ホイールを再構築してください。多くの人がphpclassesを嫌いますが、あなたが見つけることができるevalMathクラスは、数式を解析して評価するのに非常に便利です。それがどのように使用され、拡張されるかの詳細については、similar questionへの私の答えを見てください。

+0

Mark:私は実際に数学評価をしていません。私は数学を解析して自動的にLaTeXに変換しています。そのためにうまくいくパーサーはありますか? – SamB

+0

@SamB - ここで答えを試してください:http://stackoverflow.com/questions/2421768/php-based-latex-parser-where-to-begin – Spudley