正規表現を使用してファイルから重複行を見つけて削除するにはどうすればよいですか? [closed] 質問する

正規表現を使用してファイルから重複行を見つけて削除するにはどうすればよいですか? [closed] 質問する

この質問は言語に依存しません。正規表現のみを使用して、ファイル内の重複行を見つけて置き換えることはできますか?

次の入力例と私が望む出力を検討してください。

入力>>

11
22
22  <-duplicate
33
44
44  <-duplicate
55

出力>>

11
22
33
44
55

ベストアンサー1

Regular-expressions.infoには以下のページがありますファイルから重複行を削除する

基本的には、次のワンライナーを検索することになります。

^(.*)(\r?\n\1)+$

... を に置き換えます\1
注: ドットは改行と一致してはいけません

説明:

キャレットは行の先頭にのみ一致します。そのため、正規表現エンジンは、正規表現の残りの部分のみを一致させようとします。ドットそして組み合わせは、内容に関係なく、行全体に一致します。括弧は、一致した行を最初の後方参照に格納します。

次に行区切りを一致させます。疑問符に、この正規表現が Windows ( ) と UNIX ( )\r?\nの両方のテキスト ファイルで機能するようにします。つまり、この時点までは、行とそれに続く改行が一致していました。\r\n\n

ここで、この組み合わせの後に同じ行の重複が続くかどうかを確認する必要があります。これは、 で簡単に実行できます\1。これは、一致した行を保持する最初のバックリファレンスです。バックリファレンスは、まさに同じテキストと一致します。

後方参照が一致しない場合は、正規表現の一致と後方参照は破棄され、正規表現エンジンは次の行の先頭で再度試行します。後方参照が成功した場合は、プラス記号正規表現の行の追加のコピーに一致しようとします。最後に、ドル記号正規表現エンジンに、後方参照に一致するテキストが完全な行であるかどうかをチェックさせます。後方参照に一致するテキストの前には改行があることは既にわかっています(\r?\nに一致)。したがって、次に、テキストの後に改行があるかどうか、またはファイルの末尾にあるかどうかを、ドル記号

一致全体はline\nline(またはline\nline\nlineなど) になります。検索と置換を行っているため、行、その重複行、およびそれらの間の改行はすべてファイルから削除されます。元の行は保持したいが重複行は保持したくないため、\1置換テキストとして を使用して元の行を戻します。

おすすめ記事