0

私はこのような文字列を持っています:

I am down in the town seeing a crown="larry" with a cherry="red"

ユーザーに何が欲しいかを尋ねるプログラムを書きたいです。彼女がクラウンとして「ラリー」と「レッド」チェリーを持つべきストリングを要求した場合、私はストリングを返す必要があります。

さて、私はここで問題を単純化しすぎています。そのような文字列はたくさんある可能性があり、それらを解析して一致するものをすべて返す必要があります。

質問:regexecとregcompを実行する方が効率的ですか、それとも文字列を分解してstrncmpを実行するのですか?

PS:regexecは内部で何らかの比較を行う必要があり、それらは非常に効率的になるように設計されているようです。

4

2 に答える 2

1

strncmp()は、仕事には単に間違ったツールだと思います。と言えばstrstr()、議論の余地があったかもしれません。strncmp()比較し始める位置を見つけなければならないので、簡単には使えません。

を使用strstr()した場合は、次のような文字列を探します。

crown="larry"
cherry="red"

正規表現を使用する場合は、コンパイルして実行する必要があります。2 つの文字列を検索する場合、ゆがんだ正規表現を書きたくない場合を除き、2 つの正規表現があります。上記の両方の文字列をいずれかの順序で必要とする単純な比較では、strstr()1 つまたは 2 つの正規表現よりも速い 2 つの使用法を見つけることができると思います。

ただし、違いを測定する価値はあります。の実装に依存する場合がありstrstr()ます。いくつかはとても良いです。したがって、関心のあるプラットフォームで測定を実行し、どちらが適切かを選択してください。

于 2011-07-24T23:35:44.120 に答える
0

を実行するたびにおそらく新しい正規表現をコンパイルしているので、キーワードをチェックするためにregexec()使用するよりもおそらく少し遅くなるでしょう。 strncmp().

キーワードと値を事前に解析し、ある種のリスト、辞書、または文字列を指すようなものを保持するシステムを構築できると思います (各文字列は一連のキーワード="値" の組み合わせに関連付けられています)。これは 1 回で済み、検索中の作業が容易になります。

しかし、それがあなたの状況にとって意味があるかどうかを知るには、あなたの目標と既存のコードを十分に知りません。

言い換えれば、これを確実にプロファイリングする必要がありますが、それはandの組み合わせstrncmp()よりもパフォーマンスが高いと思います。もちろん、正規表現ははるかに柔軟ですが、ここでは必要ないと思います。regcomp()regexec()

添加

'=' があなたの行で頻繁に見られる文字ではないと仮定すると、もちろん を使用strchr()して、文字列内の '=' の各出現箇所を検索し、次の文字が '\"' であるかどうかを確認できます。逆方向にスキャンして、キーが一致するかどうかを確認できます.strchr()strncmp().

于 2011-07-24T20:52:56.430 に答える