3

少なくとも 30 個の数字の繰り返しシーケンスを見つけるにはどうすればよいですか?

データのサンプル

2.3758542141230068337129840546697038724373576309794988610478359908883826879271070615034168564920273348519362186788154897494305239179954441913439635535307517084282460136674259681093394077448747152619589977220956719817767653758542141230068337129840546697038724373576309794988610478359908883826879271070615034168564920273348519362186788154897494305239179954441913439635535307517084282460136674259681093394077448747152619589977220956719817767653758542141230068337129840546697038724373576309794988610478359908883826879271070615034168564920273348519362186788154897494305239179954441913439635535307517084282460136674259681093394077448747152619589977220956719817767653758542141230068337129840546697038724373576309794988610478359908883826879271070615034168564920273348519362186788154897494305239179954441913439635535307517084282460136674259681093394077448747152619589977220956719817767653758542141230068337129840546697038724373576309794988610478359908883826879271070615034168564920273348519362186788154897494305239179954441913439635535307517084282460136674259681093394077448747152619589977220956719817767653758542141230068337129840546697038724373576309794988610478359908883826879271070615034168564920273348519362186788154897494305239179954441913439635535307517084282460136674259681093394077448747152619589977220956719817767653758542141230068337129840546697038724373576309794988610478359908883826879271070615034168564920273348519362186788154897494305239179954441913439635535307517084282460136674259681093394077448747152619589977220956719817767653758542141230068337129840546697038724373576309794988610478359908883826879271070615034168564920273348519362186788154897494305239179954441913439635535307517084282460136674259681093394077448747152619589977220956719817767653758542141230068337129840546697038724373576309794988610478359908883826879271070615034168564920273348519362186788154897494305239179954441913439635535307517084282460136674259681093394077448747152619589977220956719817767653758542141230068337129840547

Vimでの私の試み

:g/\(\d\{4}\)\[^\1\]\1/
                |
                |----------- Problem here!

最初のグロブを否定する方法がわかりません。

4

5 に答える 5

4

まず、繰り返し番号を見つけるには、次の単純な検索を使用できます。

/\(\d\{5\}\).\{-}\1

この検索で​​は、5 桁の繰り返しが検出されます。残念ながら、vim は 5 桁の数字の最初から繰り返しの終わりまで (その間のすべての数字を含む) を強調表示するため、5 桁の数字が何であるかを確認するのが難しくなります。また、数列が何度も繰り返されるため、全体が強調表示されます。

:set incsearchおそらく、使用して入力する/\(\d\{5\}\).\{-}\1か、 /\(\d\{5\}\)\ze.\{-}\1 Enter キーを押さずに使用した方が、数字が何であるかを確認できるため、より便利であることがわかるでしょう。

このコマンドは、より役立つ場合があります。

:syn region repeatSection matchgroup=Search start=/\z(\d\{30}\)/ matchgroup=Error end=/\z1/ oneline

これにより、30 桁のシーケンスが黄色 (初めて表示される場合) または赤色 (繰り返される場合) で強調表示されます。これは 1 行のテキストに対してのみ機能することに注意してください (複数行は使用できません)。

于 2009-10-08T07:50:24.140 に答える
3

どう:g/\(\d\{30,\}\{2,\}\)/ですか?

于 2009-10-07T15:47:10.073 に答える
2

なぜ否定が必要なのかわかりません。/\(\d\{4\}\)\1/1回繰り返される(正確に)4桁のシーケンスに一致します。/\(\d\{30,\}\)\1/おそらく実際には、「少なくとも 30」を取得するようなものが必要です。あなたが探しているものを誤解していない限り、これは私にとってはうまくいくようです。正規表現は貪欲であるため、可能な限り最長の繰り返しシーケンスが得られることに注意してください。

于 2009-10-07T15:49:17.990 に答える
0

途中で役立つ場合は、次の文字セットが後方参照 #1 に格納されているものと同じでないことを確認する適切な方法は(?!\1). (?!)(否定先読み) グループはゼロ幅のアサーションであることに注意してください(つまり、カーソルの位置を変更せず、正規表現が失敗するかどうかをチェックするだけです)。

使用している正規表現エンジンでサポートされているかどうかはわかりません。

アップデート

紙に簡単なスケッチを書きましたが、これらの線に沿った何かが PCRE で機能する可能性があります...しかし、私はそれをテストしておらず、今はできませんが、いくつかのアイデアが得られるかもしれません:

(?=(\d{30}))\d(?=\d{29,}?\1)

私があなたを正しく理解していることを確認するために、上記の正規表現の目的は、検索される文字列全体の後半にも存在する 30 桁の任意のシーケンスと一致することです。

上記の正規表現に対する私の考えは次のとおりです。

  1. 最初に30桁のシーケンスを一致させたいのですが、次回は1桁(30桁ではない)をチェックしたいので、それらを消費したくありません。したがって、次の 30 桁を格納するキャプチャ グループで先読みを使用します。
  2. 次に、1 桁を消費して、30 桁が一致しないようにします。
  3. 次に、少なくとも 29 桁 (つまり、現在の数字のシーケンスのすぐ外側の数字から開始することを意味します) を貪欲でない量指定子と照合し、30、次に 31 などを試行します。
  4. 次に、現在テストしている 30 桁を照合します。それらがシーケンスの後半に存在する場合、正規表現は成功します。そうしないと、失敗します。
于 2009-10-07T15:47:15.390 に答える
0

このコマンドは行を一致させますが、一致さ123451234せません111111111

:g/\(\d\{4}\)\1\@!.\1/
  • \1\@!.\@!否定先読みを使用して、「この位置が ( ) グループ 1 ( ) と一致しないことを確認してから、文字 ( )\1を消費する」と言います。.
于 2009-10-07T20:59:30.190 に答える