2014-07-14 25 views
7

Yinelenen tam metin satırlarına sahip metin dosyalarım var, ancak yalnızca birini istiyorum.Tümü Tekil Satırları Ayıkla

AAAAA 
AAAAA 
AAAAA 
BB 
BBBBB 
BBBBB 
CCC 
CCC 
CCC 

isterim sadece ihtiyacım ondan aşağıdaki dört satır:

AAAAA 
BB 
BBBBB 
CCC 

Ben RegEx destekleyen bir metin düzenleyicisi (EmEditor veya Notepad ++), kullanıyorum, bir Bu metin dosyasını düşünün programlama dili, bu yüzden tamamen Düzenli İfadeyi kullanmalıyım.

Herhangi bir yardım?

DÜZENLEME: Belirtilen hsz diğer iş parçacığı işaretli ve ben bu aynı olmadığını açık yapmak istiyorum. Her ikisi de yinelenen satırları kaldırmaya ihtiyaç duysa da, onu elde etmenin yolu farklıdır. Saf RegEx'e ihtiyacım var, ancak diğer iş parçacığından gelen en iyi yanıt, belirli bir Notepad ++ eklentisine (artık daha fazla gelmiyor) dayanıyor, bu yüzden bir normal ifade bile değil. Buradaki ikinci durumda, bir regex ve Notepad ++ üzerinde çalışıyor, ancak yine de gereken EmEditor'da çalışmıyor. Öyleyse, bu sorunun bir tekrarı olduğunu sanmıyorum, bu bağlantı yararlı olsa da, bunun için bir hsz teşekkür ederim.

+0

(http://stackoverflow.com/questions/3958350/removing-duplicate-rows-in-notepad) – hsz

+0

tekrar hatları gruplanmış [Notepad yinelenen satırları ++ çıkarma] olası çift? Yani, AAAA BBBB yapmak istediğiniz dosya AAAA BBBB AAAA BBBB olabilir mi? –

+0

Gelbukh'a Cevap: Çizgiler, başlangıçta olduğu gibi aynı sırada olmalıdır. –

cevap

7

İki neredeyse özdeş seçenekleri:

Maç hatları eşleşti, ancak bunları ayıklamak için

(?sm)(^[^\r\n]+$)(?!.*^\1$) 

Tekrarlanan Değildir Tüm Hatları, gerçekten diğerlerini değiştirmek istiyor.

değiştirin Tüm Tekrarlanan Hatları

Bu Not Defteri'nde daha iyi çalışır ++:

Arama: (?sm)(^[^\r\n]*)[\r\n](?=.*^\1)

değiştirin:

  • (?s)

    nokta izin DOTALL modunu aktive boş dize Satır
  • ile eşleşecek
  • (?m) yani
  • ^ çapa biz dize başında olduklarını iddia, her satırı
  • (^[^\r\n]*) eşleştirilecek ^ ve $ sağlayan çok satırlı modunu açar Grup 1 için bir çizgi yakalayan
  • [^\r\n]*
  • lookahead (?!.*^\1$) biz c herhangi bir sayıda ölcüsemedigi iddia
  • [\r\n] maçlar satır karakter satır karakter olmayan herhangi karakter eşleşir haraçlar .*, o zaman ...
  • ^\1$ eşit hatlar grupları içeri şartıyla Grup 1
+0

Satırları "ayıklamak" istediğinizden, bir metin düzenleyicide daha iyi çalışacak bir "Tüm Tekrarlanan Çizgileri Değiştir" seçeneği eklendi. – zx81

+0

Çok teşekkür ederim. İkinci RegEx'iniz (Tüm Tekrarlanan Hatları Değiştir) ihtiyacım olan şey. Birincisi tam tersini yapar (ancak yararlı olabilir, o yüzden bırakın). Gerek duyduğum gibi hem EmEditor hem de Notepad ++ üzerinde çalışıyor, ancak boş satırları kaldırmıyor. :(Zaten sonuna kadar '|^\ n $' eklemeyi denedim, ama hiçbir şey yapmıyor.Bunu bana yardım edebilecek olsaydın, bu en iyi cevap olurdu. :) –

+0

Lütfen gözden geçirilmiş cevabı gör. Eğer bu sizin için işe yararsa, lütfen soldaki onay işaretini tıklayarak cevabı kabul etmeyi düşünün, çünkü bu şimdi rep sistemi sitede çalışıyor. Teşekkürler! – zx81

0

aynı çizgi, o, Perl gösterimde, aşağıdaki işleri AAAA AAAA BBBB BBBB olup AAAA BBBB AAAA BBBB olup:

s/(^.*$)(\r?\n\1$)*/$1/gm; 

demektir/$ ($. $) (\ r? \ n \ 1 $)/$ 1 için global olarak ve çok satırlı modda (^ ve $ match internal \ n).

Bu ifade, herhangi bir tam satırın izlediği herhangi bir tam çizginin, tek bir olayla değiştirildiği anlamına gelir.

Belirli bir düzenleyicinin nasıl kullanılacağı konusunda yardım için editörünüzün yardımına bakın.

+0

teşekkürler, ancak bu istediğim gibi basit bir metin editörü için değil. Son bölümler olmadan denedim, ama yine de çalışmıyor. –

0

Notepad ++ veya EmEditor'da çalışacağını, ancak PHP/JavaScript/Python'da değişiklik yaparak çalışacağını bilmiyorum.

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

İşte

Demo Basitçe metni kopyalamak ve seni paylaşılan bağlantısından nihai sonuç almak olduğunu.

+1

Bağlantı için teşekkürler, debuuger kullanışlıdır. Ancak, regex'in sadece harfleri değil, herhangi bir karakterini değiştirmesi gerekiyor ve bu yüzden aslında ihtiyacım olmadı. Bu yüzden \ w tarafından değiştirildi. ama şimdi her ikisi de EmEditor ve Notepad ++ her şeyi cleasr, her ne kadar "hata ayıklayıcı" üzerinde çalışıyor olsa da ... Belki farklı bir regex standardı kullanıyor ... –

+0

neden notepadd içinde çalışmadığını bilmiyorum ++ – Braj

2

Tekrarlanan ve boş satırları kaldırmak için aşağıdaki normal ifadeyi kullanabilirsiniz.

Find: ^(.*)(\r?\n\1)+$ 
Replace: \1 
+0

Teşekkür ederim. İyi bir çözüm ancak sadece Notepad ++ üzerinde çalışıyor. Soru işaretini kaldırdım '?'EmEditor üzerinde çalışmasını sağlamak için, ama yine de sadece birkaç satırı kaldırır. Bunun bir EmEditor hatası (programın kendisi) kodunuzun bir hatası olmadığını düşünüyorum, bu yüzden bu cevabı doğru olarak değerlendiriyorum. Ancak en iyisi olarak birini seçmem gerektiğinden, zx81'den birini seçtim, çünkü cevabı ayrıntılı, herhangi bir değiştirme gerektirmez (daha pratik) ve orijinal dosyada olabilecek herhangi bir boş satırı da kaldırır (Ben de ihtiyaç duyduğum bir şey) ve tabi ki her iki editörde olduğu gibi çalışır. –