-2

それはおそらく非常に単純ですが、私はそれを理解できません:

私は乱数を持っています (1,2,3 または 4 桁にすることができます) それは 2 行目に繰り返されます:

2131
2131

最初の番号を削除するにはどうすればよいですか?

編集:申し訳ありませんが、私はそれをよりよく説明しませんでした。これらの行は、プレーン テキスト ファイルにあります。エディタとして BBEdit を使用しています。実際のファイルは次のようになります (その場合のみ、約 10.000 行)。

336
336
rinde
337
337
diving
338
338
graffiti
339
339
forest
340
340
mountain

可能であれば、結果は次のようになります。

336 - rinde
337 - diving
338 - graffiti
339 - forest
340 - mountain
4

5 に答える 5

3

探す:

^(\d{1,4})\n(?:\1\n)+([a-z]+$)

交換:

\1 - \2

私は BBEdit にアクセスできませんが、正規表現の検索と置換を有効にするには、「Grep」オプションをオンにする必要があるようです。(なぜ彼らがそう呼んでいるのかはわかりませんgrep.

于 2011-09-29T04:53:48.210 に答える
2

プログラミング言語やツールについて言及していないためです。それらの番号はファイルにあると思います。各行ごとに、繰り返される番号は隣接する行にあります。uniqコマンドで問題を解決できます:

kent$  echo "1234
dquote> 1234
dquote> 431
dquote> 431
dquote> 222
dquote> 222
dquote> 234"|uniq

1234
431
222
234
于 2011-09-28T21:09:11.240 に答える
2

別の方法 find: /^(\d{1,4})\n(?=\1$)/replace:""
修飾子mg(複数行およびグローバル)

$str =
'1234
1234
431
431
222
222
222
234
234';

$str =~ s/^(\d{1,4})\n(?=\1$)//mg;
print $str;

出力:
1234
431
222
234

改訂されたサンプルでは、​​次のようなことができます。

Find: /(?=^(\d{1,4}))(?:\1\n)+\s*([^\n\d]*$)/
Replace: $1 - $2
Mods: /mg (複数行、グローバル)

テスト:

$str =
'
336
336
rinde
337
337
337
diving
338
338
graffiti
339
337
339
forest
340
340
mountain
';

$str =~ s/(?=^(\d{1,4}))(?:\1\n)+\s*([^\n\d]*$)/$1 - $2/mg;

print $str;

出力:
336 - りんで
337 - ダイビング
338 - 落書き
339
337
339 - 森
340 - 山

追加2-元の質問よりも、OPの後で希望する出力形式に感銘を受けました。それには多くの要素が含まれているため、自分自身を制御できず、複雑すぎる正規表現が生成されました。

検索:/^(\d{1,4})\n+(?:\1\n+)*\s*(?:((?:(?:\w|[^\S\n])*[a-zA-Z](?:\w|[^\S\n])*))\s*(?:\n|$)|)/
置換:$1 - $2\n
修飾子: mg ( multi-line, global)

拡大-

# Find:
s{ # Find a single unique digit pattern on a line (group 1)

   ^(\d{1,4})\n+   # Grp 1, capture a digit sequence

   (?:\1\n+)*      # Optionally consume the sequence many times,
   \s*             # and whitespaces (cleanup)

   # Get the next word (group 2)
   (?:
     # Either find a valid word
       (                      # Grp2 
          (?:
             (?:\w|[^\S\n])*     # Optional \w or non-newline whitespaces
             [a-zA-Z]            # with at least one alpha character
             (?:\w|[^\S\n])*
          )
       )
       \s*                    # Consume whitespaces (cleanup),
       (?:\n|$)               # a newline
                              # or, end of string
     |
     # OR, dont find anything (clears group 2)
   )
 }

# Replace (rewrite the new block)
 {$1 - $2\n}xmg;  # modifiers expanded, multi-line, global
于 2011-09-28T22:06:58.590 に答える
0

探す:

((\d{1,4})\r(\D{1,10}))|(\d{1,6})

交換:

\2 - \3

そこから簡単にクリーンアップできるはずです。

于 2015-12-17T17:16:16.243 に答える
-2

このようなパターンを検出することは、正規表現を使用して行うことはできません。

文字列を「\n」で分割して比較できます。

于 2011-09-28T21:27:25.757 に答える