2016-03-21 6 views
-1

こんにちは、これは私のC++の正規表現C++正規表現のスピードを最適化

regex MyRGX(R"~((\w*)\s*[(]([^;]*)[)]\s*[;])~"); 

であり、これは、この正規表現は Data1を取得し、すべてが任意の条件で();の間に存在する私の列

Data1 (

    anything1 

); 

です。しかし、私はData1のような50以上のブロックがある場合、この正規表現の検索速度は、pcreの同等の正規表現よりも低くなります。私は、この正規表現は、スピードを最適化されていないと思う。この条件でこの正規表現のスピードを上げる提案がありますか(すべて();と...の間に存在しますか?)

+1

あなたの文字列は私にとっては文字列のようには見えません。 – nwp

+0

あなたはそれがそうだと思います。 – Elh48

+0

私の提案:可能であれば、キャプチャしていないグループ( '()'の代わりに '(?:)')を使用してください。可能であれば、 '*'の代わりに '+'を使います( '*'は空文字列にマッチします。最後に、[コンストラクタ](http://en.cppreference.com/w/)で[最適化フラグ](http://en.cppreference.com/w/cpp/regex/basic_regex)を使用することができます。 cpp/regex/basic_regex/basic_regex)より最適な正規表現を得ることができます(より遅い構築コストで)。 regex_constants :: optimize | regex_constants :: ECMAScript(regex_constants :: optimize | regex_constants :: ECMAScript)を使うと、 ); '。 – Cornstalks

答えて

0

私は前の質問から疑いがあったように、これはRegexが最も論理的な解決策ではないケースのようです。

「正規表現」は、「正規表現」から「正規表現」になります。カッコにマッチした言語(C++自体のような)は規則的ではありません。さて、「正規表現」と呼ばれるものは、いくつかの非正規言語を含むように進化しましたが、それは最適ではありません。

この場合、完全に普通のパーサが動作するように見えます。私が理解しているように、目標は();の間のものを探すことです。だから、(の前に単純なテキスト検索を行い、逆順に);を探します。両方が見つかり、();に先行することを確認し、見つかったインデックスペアを使用して部分文字列を抽出します。

+0

標準ライブラリ関数を使用して実装できるO(N)ソリューションを提供します.O(N)バウンドを持つ可能性があります。 -1を得る。 – MSalters