2016-05-10 5 views
1

ich eine Regex aufgebaut haben (in .NET):Build komplexe reguläre Ausdruck

(\d+)\s(.*)\s+(\d+,\d+)\s(tk|kg)\s(\d+,\d+)\s(\d+,\d+)\s(\d+,\d+)\s(\d+,\d+)\s(\d+,\d+) 

zum Parsen einer Datei wie:

KMta 
Kokku KMta 
1 FREETIME Veiniklaas 20cl 10tk (kõrge jalaga) 4,000 tk 3,86 3,22 0,00 3,22 12,87 
C50414 6411634254471 Pakendis 10,00 
2 ESTOVER Eesti juust 25,2% 1kg(viilud) 2,000 tk 5,51 4,59 0,00 4,59 9,18 
C62777 4740572003516 Pakendis 9,00 
Prt. \ 31.05.16 \ 7.06.16 Kauba jälgitavuse tagamiseks märgista või lisa konkreetselt ostetud partii 
3 DORBLU Sinihallitusjuust 50% 100g(kolmnurk) 5,000 tk 1,47 1,23 0,00 1,23 6,13 
C28170 4000504210024 Pakendis 40,00 
Prt. \ 26.05.16 \ 2.06.16 Kauba jälgitavuse tagamiseks märgista või lisa konkreetselt ostetud partii 
4 WOOL Külmsuitsu heeringafilee kg 0,990 kg 4,56 3,80 0,00 3,80 3,76 
C33470 23192278 Pakendis 10,00 
Prt. \ 22.04.16 \ 25.04.16 \ 28.04.16 \ 2.05.16 Kauba jälgitavuse tagamiseks märgista või lisa konkreetselt ostetud partii 
5 TARPLAN Provansaal majonees 50% 900g 3,000 tk 2,07 1,73 0,00 1,73 5,18 
C5035 4740159000082 Pakendis 8,00 

Wie u es zu sehen bekommen eine 'Zeilen' aus Quelldatei enthält eine 'Tabelle'. Das Ergebnis der Anpassung ist wie:

1 FREETIME Veiniklaas 20cl 10tk (kõrge jalaga) 4,000 tk 3,86 3,22 0,00 3,22 12,87 
2 ESTOVER Eesti juust 25,2% 1kg(viilud) 2,000 tk 5,51 4,59 0,00 4,59 9,18 
... 

etc

aber ein Quelltext kann enthält etwa so:

18 PÄHKLINÄPP Kuivatatud mustad ploomid 
500g(kivideta) 
1,000 tk 3,15 2,63 0,00 2,63 2,63 

Wie wir nach der zweiten Gruppe sehen (.*) Wir haben eine neue Linien und dann Die Zeile wird fortgesetzt. Also, wie kann ich meine Regex ändern, damit diese "ungültigen" Zeilen analysiert werden? Vielen Dank!

+0

Try '^ (\ d +) \ s + * \ s + (\ d +, \ d +) \ s + (tk | kg) \ s (\ d +, \ d +) \ s + (\ d +, \ d +) \ s + (\ d +, \ d +) \ s + (\ d +, \ d +) \ s + (\ d +, \ d +) '. Siehe goo.gl/rIvT1w –

+0

Ich versuche mit meiner Datei, aber es stimmt nicht mit dieser Zeile überein. Hier der Teil der Quelldaten mit dem Ausdruck u. Wie wir sehen, 18 Zeilen nicht übereinstimmen. siehe goo.gl/KRbE4C –

+0

Sie haben vergessen, den ** Singleline ** -Modus einzuschalten. Siehe meine Regex: Es hat die Inline-Modifikatoren an Ort und Stelle. '(? ms)' bedeutet * aktiviert Singleline- und Multiline * -Modi. Werfen Sie sie nicht weg, wenn Sie die Regex verwenden. Siehe [weitere Demo] (https://regex101.com/r/mW2dE2/1) –

Antwort

1

Sie haben vergessen, den Single-Line-Modus einzuschalten. Siehe my regex:

@"(?ms)^(\d+)\s+.*?\s+(\d+,\d+)\s+(tk|kg)\s(\d+,\d+)\s+(\d+,\d+)\s+(\d+,\d+)\s+(\‌​d+,\d+)\s+(\d+,\d+)" 

Es hat die Inline-Modifikatoren an Ort und Stelle. (?ms) bedeutet aktivieren singleline (. entspricht auch Newline) und multiline (^ entspricht Zeile Start und $ entspricht Zeilenende) Modi. (? Ms).?:

C# demo

var re = @"(?sm)^(\d+)\s+.*?\s+(\d+,\d+)\s+(tk|kg)\s(\d+,\d+)\s+(\d+,\d+)\s+(\d+,\d+)\s+(\d+,\d+)\s+(\d+,\d+)"; 
var str = "C40956 4770149203735 Pakendis 16,00\n16 KNORR Toscana tomatisupp 1,2kg 1,000 tk 12,63 10,53 0,00 10,53 10,53\nC41735 8711200567249 Pakendis 6,00\n17 PÄHKLINÄPP Kuivatatud aprikoosid 500g 1,000 tk 3,48 2,90 0,00 2,90 2,90\nC74424 4750195020272 Pakendis 12,00\n18 PÄHKLINÄPP Kuivatatud mustad ploomid \n500g(kivideta) \n1,000 tk 3,15 2,63 0,00 2,63 2,63\nC74423 4750195020289 Pakendis 12,00\n19 LUTIK Marineeritud kännuseened 530g(klaas) 1,000 tk 1,74 1,45 0,00 1,45 1,45\nC40070 880730110879 Pakendis 12,00\nPrt. \\ 18.09.18 Kauba jälgitavuse tagamiseks märgista või lisa konkreetselt ostetud partii"; 
var res = Regex.Matches(str, re) 
      .Cast<Match>() 
      .Select(m => m.Value) 
      .ToList(); 
Console.WriteLine(string.Join("\n", res)); 
Verwandte Themen