2012-04-30 6 views
0

私はJavascriptで作業していますが、これは一般的な正規表現の質問だと思います。等距離文字の特定の正規表現検索の最適化

長い文字列の部分文字列を等間隔で検索するスクリプトを作成しています。たとえば、テキストa11b22c33d44では、2つの連続する文字の間に2の距離を持つ文字列abcdがあります。

regexp検索を使用してこのような文字列を見つけるのは簡単です。上記の例では、正規表現/a.{2}b.{2}c.{2}d/を検索するだけです。私が今やっていることは、検索する単語と連続した文字の間の距離を指定すると、その間に.{n}(nは距離)を置くだけで、これを正規表現としてコンパイルし、残りの作業をさせます。

これは、文字間の距離が小さい、たとえば約1000である限り、実際には非常にうまく機能します。その後は遅くなります。それでも動作しますが、同じ検索をより効率的に実行する別の方法があることを願っています。なぜなら、より大きなギャップのためにはかなり遅くなければならないという明白な理由は見当たりません。(まだテキスト全体を一度だけ読み直す必要があります)

+0

あなたはregexp 'a。{2} b。{2} c。{2} d'も' aaabbbcccd'にマッチします - これは意図的なのでしょうか? – hochl

+0

はい、aaabbbcccdには文字間に距離2の部分文字列として "abcd"が含まれています。 –

答えて

1

問題は、ドットが文字。 aが見つかるたびに、次にn文字を詰め込み、bにマッチして試合をあきらめてください。それは無駄な努力の多くです。

の詳細については、で検索してください。検索用語は、常に文字で完全に構成されます場合たとえば、あなたが変更することで、多くの物事をスピードアップすることができ.別の可能性は、次の必要な文字以外のものと一致することです

/a[^a-z]{1000}b[^a-z]{1000}c[^a-z]{1000}d/i 

[^a-z]へ:

/a[^b]{1000}b[^c]{1000}c[^d]{1000}d/i 

どちらの解決策も、必要な文字間のテキストに同じ文字を含めることはできないという前提に基づいています。

その後、再び、あなただけの全体の言葉を探している、とあなたが知っていれば、検索語の最初と最後の文字は常に多分あなただけの単語の境界を追加する必要があり、単語の文字になります。

/\ba.{1000}b.{1000}c.{1000}d\b/i 
+0

ありがとうございます。問題は、その間に手紙がないことを想定できないことです(ほぼ確実にそうなります)。 –

関連する問題