2011-10-21 24 views
6

私は数年前から正規表現を使用してきていて、快適に感じていますが、使用する際に制限があるのだろうかと思っていました。私は再帰に関連する制限について知っています(ここで議論しますhttp://blogs.msdn.com/b/jaredpar/archive/2008/10/15/regular-expression-limitations.aspx)。メモリに関する制限はありますか?私はあなたがメモリに収まるような大きさの文字列をキャプチャできると仮定しています(またはVMがあなたに許可する)。正規表現の制限?

私が知っておくべきregexの他の制限はありますか?事前に

おかげで、

クリス

+1

それぞれに異なる制限があるので、使用している正規表現エンジンを実際に指定する必要があります。いくつかの文法のような正規表現を許すようになった人もいます。 tchrist(Tom Christiansen)の答えはここにあるので、正規表現エンジンが到達したパワーを知ることができます。 – ninjalj

答えて

5

制限

  1. がすべてを解決することはできません。 (SOの誰でも何が起こるかは、正規表現でHTMLを解析しようとすると ) - 可読性とパフォーマンスの問題のすべてには使用しないでください。適切な場所で使用してください。単純なタスクではなく、文字列の部分文字列のように、また複雑なタスクではありません。

ボトムライン、それはツールです。他のツールと同様に使用してください。それを過度に使用しないでください。あなたのツールキットの唯一のツールにしないでください。

8

ギンモクな正規表現は非常に遅く、メモリが空いている可能性があります。私が知っているのは、私が創造したからです。これは、正規表現によってトークン化されるべきではないものをトークン化することができます。 :-)あなたがリンクをしたいのなら...今...私は "小さな"正規表現をベンチマークしていないので、私はそのスピードを知らない。彼らは確かにコンパクトです。

ああ私は忘れていた、regexesは悪です。彼らの主な問題は、彼らがハンマーのようなものであり、あなたがそれらを持っているとき、あなたはすべての問題を爪のようにしようとしているということです。だから彼らの主な問題はユーザー(プログラマー)にある。

最初の「大きな」制限:Javascriptでは、Unicodeをサポートしていないサブセットのみが実装されています。通常、サーバー側で使用する言語はより完全な実装であるため、jsによって制限されます。 .NETのような完全な実装でさえも、サロゲートペアのサポートがなく、「合成」文字(結合マークを使用する文字)のサポートがないという大きな制限があります。しかし、いつものように、問題はプログラマーにあります。 Unicodeを知っているプログラマーの多くは、Unicodeの複雑さ、さまざまな桁数、発音区別符の複雑さを知っていますか?

第2の「大きな」制限:保守性。彼らは書かれているときに複雑であり、読むことができません。しかし数ヶ月後?彼らは悪化する!そして、新しいプログラマーを育成しなければならない場合、今ではさらに1つの言語、すなわち正規表現を学ばなければなりません。

第3の「大きな」制限:あまりにも多く隠れる。 \d\s\dが表示されます。どういう意味ですか?数字とスペースと数字?確かに。しかし、.NET Regexesの\d\sはいずれもマイクロワールドを「隠す」。 \dは、非ヨーロッパの桁に「一致」します(Unicodeには多くの桁があります)。 \s "それは私がその名前を知らない非常に多くの秘密のスペースに"マッチする "...私はそれについて考えることさえしたくない。彼らは氷山のようなものです。わずか1/8が水中にあり、7/8は隠されています。しかしそれはおそらくあなたを殺すでしょう7/8です。

+0

JavaScriptが「サブセット」のみをサポートしている場合、どのように正規表現の誤りですか?また、可読性は冗長なregexes(JavaScriptはこれをサポートしていません)で問題になるべきではありません。確かに、どの言語でも悪いプログラムを書くことができるのと同じように、あなたが何をしているのか(ツールを悪用しているのか)わからなければ、巨大でパフォーマンスが悪い正規表現を書くことができます。そして、意味の1オンスを作らない非修飾 "悪"分類のための-1。 –

+0

@TimPietzckerオブジェクトにフォールトを与えることは、常に愚かです。この欠陥は、それを作成/投影した愚かな人間にあります。正規表現には誤りがありません。彼らは不具合です** **。そして、彼らは間違っているだけではありません** ** **彼らは間違っているだけでなく** 1 **彼らは別の時代の子供、ユニコードや国際化のないもっとシンプルな時代、2)すべてのプログラマーが別の方法。同じように、彼らは*悪ではありません*、銃は悪*ではないが、銃のように、人々は愚かなことをする。 – xanatos

+0

@TimPietzcker今、Regexesのさまざまな実装が存在するという事実...これは問題です。同じように、多くのUnix(互換性がないもの)があった場合、この「断片化」が問題でした。 RegexをASP.Netに書く必要がある場合は、JSで使用できるサブセットのみを使用でき、クライアント側とサーバー側で使用することができます。オハイオ州、私はフェラーリを持っていますが、私は土の道に行く必要があります...うわー! – xanatos

3

正規表現は、文脈自由なものだけを解析することができ、スタック(つまり実際のパーサー)が必要です。

これは唯一のの制限です。パフォーマンスは特定の実装に依存しますが、一般にステートマシンと比較してプリコンパイルさえも遅いです。

+5

-1:ほとんどの正規表現エンジン(私が注意深く見ていないre2の可能性のある例外を除いて)純粋な正規表現を超えました。 – ninjalj

+0

あなたはスタック可能な正規表現を認識しない "純粋主義者"の一人ですか? – xanatos

+0

@ninjalj私は、非正規の正規表現を認識していませんでしたが、私は例や記事を教えてくれますか?ありがとう。 –

関連する問題