2011-09-28 7 views
2

Ok, il y a beaucoup d'expressions régulières, mais comme toujours, aucune d'entre elles ne semble correspondre à ce que j'essaie de faire.Expression régulière multiligne remplacer

Je dispose d'un fichier texte:

F00220034277909272011         
H001500020003000009272011        
D001500031034970000400500020000000025000000515000000000 
D001500001261770008003200010000000025000000132500000000 
H004200020001014209272011        
D004200005355800007702200005142000013420000000000000000 
D004200031137360000779000005000000012000000000000000000 
H050100180030263709272011        
D050100001876700006000300019500000025000000250000001500 
D050100001247060000071500030000000025000000280000000000 
D050100002075670000430400020000000025000000515000000000 
D050100008342500007702600005700000010000000000000000700 
D050100009460270000702100015205000025000000000000006205 
D050100008135120000702400015000000010000000000000001000 
D050100006938430000702200026700000010000000000000001000 
D050100006423710008000200025700000000000000000000001000 
D050100009488040008000600007175000000000000000000001000 
D050100001299190000800100016300000000000000000000003950 
D050100001244850000800400005407000000000000000000001607 
D050100001216280000840200020000000000000001000000006200 
D050100001216840000479000008175000000000000100000001000 
D050100001265880000410200014350000000000000100000001000 
D050100007402650002000300026700000000000000100000001000 
D050100001305150002000200016175000000000001000000000000 
D050100005435430000899700022350000000000001000000000000 
D050100031113850000500200008200000000250000100000001000 

et, avec une expression régulière multiligne (.NET aromatisée), je veux faire un remplacement pour que je sois:

H050100180030263709272011        
D050100001876700006000300019500000025000000250000001500 
D050100001247060000071500030000000025000000280000000000 
D050100002075670000430400020000000025000000515000000000 
D050100008342500007702600005700000010000000000000000700 
D050100009460270000702100015205000025000000000000006205 
D050100008135120000702400015000000010000000000000001000 
D050100006938430000702200026700000010000000000000001000 
D050100006423710008000200025700000000000000000000001000 
D050100009488040008000600007175000000000000000000001000 
D050100001299190000800100016300000000000000000000003950 
D050100001244850000800400005407000000000000000000001607 
D050100001216280000840200020000000000000001000000006200 
D050100001216840000479000008175000000000000100000001000 
D050100001265880000410200014350000000000000100000001000 
D050100007402650002000300026700000000000000100000001000 
D050100001305150002000200016175000000000001000000000000 
D050100005435430000899700022350000000000001000000000000 
D050100031113850000500200008200000000250000100000001000 

de sorte que, En gros, je prends tout ce qui commence par [HD]0501 et rien d'autre.

Je sais que cela semble plus adapté à une correspondance qu'un remplacement, mais je passe par un moteur pré-construit qui accepte une chaîne de modèle Regex et une chaîne de remplacement regex seulement.

Que puis-je fournir pour un motif et une chaîne de remplacement pour obtenir le résultat souhaité? Multiline Regex est une configuration codée en dur?

Je pensais à l'origine quelque chose comme ça fonctionnerait:

recherche: (?<Match>^[HD]0501\d+$), mais rien ne correspond.

recherche: (?!^[HD]0501\d+$), mais cela correspondait à un tas de chaînes vides, et je ne pouvais pas comprendre ce qu'il faut mettre pour la chaîne de remplacement.

recherche: (?!(?<Omit>^[HD]0501\d+$)), "Groupe 'Omettre' not found."

Il semble que cela devrait être simple, mais comme toujours, Regex parvient à me faire sentir bête. De l'aide serait grandement appréciée.

Répondre

3

Essayez correspondant le motif suivant:

(?m)^(?![HD]0501).+(\r?\n)? 

et le remplacer par une chaîne vide.

La démonstration suivante:

using System; 
using System.Text.RegularExpressions; 

namespace Test 
{ 
    class MainClass 
    { 
    public static void Main (string[] args) 
    { 
     string input = @"F00220034277909272011         
H001500020003000009272011        
D001500031034970000400500020000000025000000515000000000 
D001500001261770008003200010000000025000000132500000000 
H004200020001014209272011        
D004200005355800007702200005142000013420000000000000000 
D004200031137360000779000005000000012000000000000000000 
H050100180030263709272011        
D050100001876700006000300019500000025000000250000001500 
D050100001247060000071500030000000025000000280000000000 
D050100002075670000430400020000000025000000515000000000 
D050100008342500007702600005700000010000000000000000700 
D050100009460270000702100015205000025000000000000006205 
D050100008135120000702400015000000010000000000000001000 
D050100006938430000702200026700000010000000000000001000 
D050100006423710008000200025700000000000000000000001000 
D050100009488040008000600007175000000000000000000001000 
D050100001299190000800100016300000000000000000000003950 
D050100001244850000800400005407000000000000000000001607 
D050100001216280000840200020000000000000001000000006200 
D050100001216840000479000008175000000000000100000001000 
D050100001265880000410200014350000000000000100000001000 
D050100007402650002000300026700000000000000100000001000 
D050100001305150002000200016175000000000001000000000000 
D050100005435430000899700022350000000000001000000000000 
D050100031113850000500200008200000000250000100000001000"; 

     string regex = @"(?m)^(?![HD]0501).+(\r?\n)?"; 

     Console.WriteLine(Regex.Replace(input, regex, "")); 
    } 
    } 
} 

impressions:

H050100180030263709272011        
D050100001876700006000300019500000025000000250000001500 
D050100001247060000071500030000000025000000280000000000 
D050100002075670000430400020000000025000000515000000000 
D050100008342500007702600005700000010000000000000000700 
D050100009460270000702100015205000025000000000000006205 
D050100008135120000702400015000000010000000000000001000 
D050100006938430000702200026700000010000000000000001000 
D050100006423710008000200025700000000000000000000001000 
D050100009488040008000600007175000000000000000000001000 
D050100001299190000800100016300000000000000000000003950 
D050100001244850000800400005407000000000000000000001607 
D050100001216280000840200020000000000000001000000006200 
D050100001216840000479000008175000000000000100000001000 
D050100001265880000410200014350000000000000100000001000 
D050100007402650002000300026700000000000000100000001000 
D050100001305150002000200016175000000000001000000000000 
D050100005435430000899700022350000000000001000000000000 
D050100031113850000500200008200000000250000100000001000 

Une explication rapide:

  • (?m)
    • activer le mode multi-ligne de sorte que ^ correspond au début d'une nouvelle ligne;
  • ^
    • match, le début d'une nouvelle ligne;
  • (?![HD]0501)
    • regarder vers l'avenir pour voir s'il n'y a pas "H0501" ou "D0501";
  • .+
    • en jeu une ou plusieurs caractères autres que les caractères ruptures de ligne;
  • (\r?\n)?
    • matcher un saut de ligne en option.
+0

Cela a fait. Merci! Je vais devoir comprendre _how_ il l'a fait, mais cela me fait aller. –

+0

Vous êtes les bienvenus @Jeremy, j'ai également ajouté une brève explication du modèle. –

Questions connexes