2010-10-21 26 views
5

Mam plik tekstowy, który zawiera więcej lub mniej akapitów. Tekst nie jest w rzeczywistości słowami, danymi rozdzielanymi przecinkami; ale to naprawdę nie jest tak ważne. Plik tekstowy jest podzielony na sekcje; mogą być sekcje i podsekcje. Podział sekcji jest oznaczony przez więcej niż jedną linię i podsekcję przez znak nowej linii.C# Regex.Replace Multiple Newlines

więc próbka danych:

This is the, start of a, section 
908690,246246246,246246 
246246,246,246246 

This is, the next, section, 
sfhklj,sfhjk,4626246 
4yw2,fdhds5juj,53ujj 

Zatem powyższe dane zawiera dwa odcinki, każdy z trzech podrozdziałach. Czasami jednak między sekcjami występuje więcej niż jedna pusta linia. Kiedy to nastąpi, chcę przekonwertować wiele znaków nowego wiersza, powiedzmy \n\n\n\n, tylko na \n\n; Myślę, że regex to prawdopodobnie sposób na zrobienie tego. Mogę również potrzebować różnych standardów newline, unix \n i Windows \r\n. Myślę, że pliki prawdopodobnie zawierają wiele kodów kreskowych.

Oto wyrażeń regularnych, które wymyśliłem; to nic specjalnego:

Regex.Replace(input, @"([\r\n|\n]{2,})", Enviroment.NewLine + Enviroment.NewLine} 

Po pierwsze, czy jest to dobre rozwiązanie dla regex? Nie jestem taki dobry w regex.

drugie, potem chcesz podzielić każdą sekcję do elementu w tablicy ciągów:

Regex.Split(input, Enviroment.NewLine + Enviroment.NewLine) 

Czy istnieje sposób, aby połączyć te kroki?

+0

Chyba powinieneś najpierw zastąpić '([\ r \ n | \ n])' 'Enviroment.NewLine', aby zachować spójność danych. I nie wiem, jak to zoptymalizować, chyba nie można ich połączyć. Sądzę, że jesteś na dobrej drodze. Możesz ustawić 'RegexOptions.Compiled', aby było szybsze. – BrunoLM

Odpowiedz

6

[\r\n|\n] jest niepoprawny. To jest character class, który pasuje do jednego ze znaków: \r, \n lub |.

Typowe idiomy do dopasowania ogólnego separatora linii to (?:\r\n|[\r\n]) lub (?:\n|\r\n?). Będą one zgodne z \r\n (DOS/Windows), \r (starszy Macintosh) lub \n (Unix/Linux/Mac OS X).

bym normalizować wszystkie separatory wiersza do \n, a następnie podzielone na dwie lub więcej osób:

Regex.Split(Regex.Replace(source, @"(?:\r\n|[\r\n])", "\n"), @"\n{2,}") 
+0

Świetnie, dzięki. Dokładnie to, czego szukałem. Dobrze wiedzieć, że moje regex był co najmniej częściowo na dobrej drodze. – Shawn

0

będę po prostu użyć String.Split i pierwszy podzielić tekst na sekcje, stosując podwójne znaki końca wiersza jako separatora, następnie podzielić każdy sekcji do podsekcji, używając pojedynczego znaku nowej linii jako ogranicznika. Następnie otrzymasz żądaną tablicę. Możesz użyć obiektu List<string> jako kontenera i dodać do kontenera tablicę zwróconą z metody podziału przy użyciu AddRange.