0

私はJavascriptで作業していますが、それは一般的な正規表現の質問だと思います.

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

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

これは、文字間の距離が小さい場合 (たとえば 1000 前後)、実際には非常にうまく機能します。その後は遅くなります。それでも機能しますが、同じ検索をより効率的に実行する別の方法があることを願っています。ギャップが大きい場合に大幅に遅くなる明確な理由がわかりません (それでも、テキスト全体を 1 回だけ確認する必要がありますよね?)

4

1 に答える 1

1

問題は、ドットが文字を含むほとんどすべてに一致することです。を見つけるたびに、次のn文字aをむさぼり食って、その一致をあきらめる前に a との一致を試みる必要があります。それは多くの無駄な努力です。 b

一致させたくないものについて、より具体的にする必要があります。たとえば、検索用語が常に文字だけで構成されている場合.[^a-z]

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

もう 1 つの可能性は、次の必要な文字以外のすべてに一致することです。

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

どちらのソリューションも、必要な文字間のテキストに同じ文字を含めることはできないという前提に基づいています。

繰り返しになりますが、単語全体のみを検索していて、検索語の最初と最後の文字が常に単語の文字であることがわかっている場合は、単語の境界を追加する必要があるだけかもしれません。

/\ba.{1000}b.{1000}c.{1000}d\b/i
于 2012-04-30T23:24:50.650 に答える