4

パターンのすべてのセットが特定の文字列内に存在することを一致させるための最適な方法は何でしょうか。たとえば、中程度の長さの数千の文字列(それぞれ約30〜50文字)のコレクションがあるとします。ユーザーは、各文字列が評価される一連のパターン(実際には一連の文字だけのパターンではない)を指定できる必要があります。文字列には、指定されたすべてのパターンが含まれている必要があります。

したがって、ユーザーが次のパターンを評価したいとします。

123
xyz
abc

次のような文字列:

john_smith_123456_abcdef_9999_tuv 

3つのうち2つしか含まれていないため、falseになりますが、次のような文字列が含まれます。

jane_doe_abcdef_123_9999_tuvwxyz 

3つすべてが含まれているので本当です

まず、regexまたはstring.Contains()?または、一方が他方よりも優れたパフォーマンスを発揮するというトレードオフのポイントはありますか?そして第二に、正規表現が進むべき道であると仮定すると、このシナリオに使用するのに最適なタイプの正規表現は何でしょうか?

どうもありがとう!

4

5 に答える 5

1

次の正規表現が機能します。

^(?=.*123)(?=.*xyz)(?=.*abc).*$

これは、先読みを使用して、検索する3つのサブ文字列が文字列のどこかに含まれていることを確認し、.*すべてのサブ文字列が見つかった場合は、を使用して文字列全体を消費します。

于 2012-04-10T21:48:10.987 に答える
1

あなたが探しているのは、大きな文字列の中の特定の文字列ですよね?もしそうなら、正規表現はここではあまり役に立ちません。確かに、先読みすることはできますが、読みやすさやパフォーマンスの面で、実際には何も得られていません。正規表現はテキスト内のパターンを見つけるためのものであり、部分文字列のためのものではありません。

リストや配列などを繰り返し処理し、を使用して各部分文字列を探しますContains

于 2012-04-10T21:49:42.470 に答える
1

正規表現は、ほとんどの場合、単純なマッチングでは遅いオプションです。String.Contains()実際に正規表現機能が必要な場合を除いて、を使用する必要があります。ユーザーがテストする実際の文字列のみを入力できる場合は、正規表現は必要ありません。

于 2012-04-10T21:50:10.597 に答える
0

正規表現は、このような単純なタスクにはやり過ぎのようです。あなたは実際には部分文字列ほどパターンを探していません。その場合String.Contains()、その仕事に完全に適しています(あなたが私たちに話していない「隠された」要件がないと仮定します)。

于 2012-04-10T21:50:15.747 に答える
0

正規表現ベースのソリューションが遅すぎる場合を決定するための経験則はありません。実際、正規表現が他のどのテクノロジーよりも遅いと予想する理由はありません。他のツールと同様に、それを使用するのに適度に有能であり、それが最も単純なアプローチを提供すると思われる場合は、先に進んで試してみてください。テストが意味のあるものになるように十分なコードが記述されたら、それをベンチマークします。

さらに、パターンが非常に単純で使用できる場合は、正規表現を台無しにして、共鳴カスケードの壊滅的なバックトラックシナリオContains()を作成する可能性もほとんどありません。覚えておいてください:正規表現はCPUを揚げません、正規表現の作者はそうします。:D

私は、 FJによって提案された複数先読みアプローチについてあなたに同意する傾向があります。この仕事にはおそらく遅すぎます。これは、複数回呼び出すのと実質的に同じContains()ですが、バックトラックによる追加のオーバーヘッドがあります。とにかくテストする価値がありますが、最初にこのアプローチを試してみます。

^(?>(?:123()|xyz()|abc()|.)+$\1\2\3)

先読みアプローチでは、検索語ごとに文字列全体をスキャンする必要がある場合、この正規表現は文字列を1回だけスキャンし、バックトラックすることはありません。検索用語がヒットするたびに、その用語の直後のキャプチャグループは、何もキャプチャしていなくても、試合に参加したと言われます。文字列の終わりに達すると、グループが一致に参加した場合、各後方参照は再び「何も一致しません」。それ以外の場合は失敗を報告し、全体的な一致は失敗します。

于 2012-04-11T01:07:34.790 に答える