2010-10-21 5 views
5

J'ai un fichier texte qui contient plus ou moins de paragraphes. Le texte n'est pas réellement des mots, ses données délimitées par des virgules; mais ce n'est pas vraiment important. Le fichier texte est en quelque sorte divisé en sections; il peut y avoir des sections et des sous-sections. La division des sections est indiquée par plus d'un saut de ligne et de sous-sections par un saut de ligne.C# Regex.Remplacer plusieurs nouvelles lignes

données Ainsi échantillon:

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

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

Ainsi, les données ci-dessus contient deux sections, chacune avec trois sous-sections. Parfois, cependant, il y a plus d'une ligne vide entre les sections. Lorsque cela se produit, je veux convertir les caractères de nouvelle ligne, disons \n\n\n\n à \n\n; Je pense que regex est probablement le moyen de le faire. Je peux également avoir besoin d'utiliser différentes normes de nouvelle ligne, unix \n, et les fenêtres \r\n. Je pense que les fichiers contiennent probablement plusieurs encodages finaux.

Voici l'expression rationnelle que j'ai trouvée; rien de spécial:

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

Premièrement, est-ce une bonne solution regex? Je ne suis pas très bon avec regex.

Deuxièmement, je veux ensuite diviser chaque section en un élément dans un tableau de chaînes:

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

Est-il possible de combiner ces étapes?

+0

Je suppose que vous devriez d'abord remplacer '([\ r \ n | \ n])' par 'Enviroment.NewLine' pour garder les données cohérentes. Et je ne connais pas de moyen de l'optimiser, je suppose que vous ne pouvez pas les combiner. Je suppose que vous êtes sur la bonne voie. Vous pouvez définir 'RegexOptions.Compiled' pour le rendre plus rapide. – BrunoLM

Répondre

6

[\r\n|\n] est faux. C'est un character class qui correspond à l'un des caractères \r, \n, ou |.

Les idiomes communs pour faire correspondre un séparateur de ligne générique sont (?:\r\n|[\r\n]) ou (?:\n|\r\n?). Ceux-ci correspondent \r\n (DOS/Windows), \r (ancien Macintosh) ou \n (Unix/Linux/Mac OS X).

Je normaliser tous les séparateurs de ligne à \n, puis divisés sur deux ou plusieurs de ceux-ci:

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

Super, merci. Exactement ce que je cherchais. C'est bon de savoir mon regex était au moins semi sur la bonne voie. – Shawn

0

Je vais juste utiliser String.Split et découpez d'abord le texte en sections à l'aide de doubles sauts de ligne comme séparateur, puis diviser chaque de la section dans la sous-section en utilisant une nouvelle ligne simple comme délimiteur. Vous finirez alors avec le tableau que vous vouliez. Vous pouvez utiliser l'objet List<string> comme conteneur et ajouter le tableau renvoyé par la méthode de division en utilisant AddRange au conteneur.

Questions connexes