1

最近、自分のWebアプリに接続しているユーザーエージェントがクローラーであることを検出できる正規表現を探していました。

グーグル、ヤフー、ビング、フェイスブック、その他多くのクローラーがあり、それらはユーザーエージェントヘッダーで自分自身を宣伝しています。したがって、基本的には、指定された文字列内のこれらのサブ文字列のいずれかに一致しようとするreglexpをコンパイルできると思いました。google | yahoo | bing | facebookのような正規表現と簡単に一致させることができますが、指定された文字列のリストが十分に大きく、それらの多くが同様のプレフィックスまたはサフィックスを持っている場合は、より効率的な正規表現をコンパイルできます。(この正確な目的のために、internetzに浮かんでいる人間のコンパイラ正規表現があります)。

それで、このような状況で使用できるツールまたはアルゴリズムはありますか?単語のリストが与えられると、入力文字列内の単語のいずれかが一致するかどうかを判断する正規表現を返しますか?

PS今日、遺伝的アルゴリズムを使用したソルバーであるycombinator http://regex.inginf.units.it/に非常によく似たものが投稿されたので、これを思い出しました。また、一般的なケースではNP困難な問題である可能性がありますが、20〜30語の単純なリストで機能する場合はそれでも役立ちます。

4

1 に答える 1

0

fgrepで使用されているAho-Corasick 文字列マッチング アルゴリズム は、ほぼ正確にこれを行いますが、正規表現を生成するのではなく、マッチングを行う内部データ構造を構築します。そこにリンクされているWikipediaのページにはC、Pythonなどの実装があるので、それをクローラーに含めることができます。データ構造を一度コンパイルし、コンパイルされたバージョンを使用してすべてのユーザー エージェントをテストします。

于 2012-10-22T13:26:51.907 に答える