Reputation: 101
I have built an regex (in .NET):
(\d+)\s(.*)\s+(\d+,\d+)\s(tk|kg)\s(\d+,\d+)\s(\d+,\d+)\s(\d+,\d+)\s(\d+,\d+)\s(\d+,\d+)
for parsing a file like:
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
As u see it getting a 'rows' from source file contains a 'table'. The result of matching is like:
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
but a source text can contains something like this:
18 PÄHKLINÄPP Kuivatatud mustad ploomid
500g(kivideta)
1,000 tk 3,15 2,63 0,00 2,63 2,63
As we see after second group (.*)
we have a new lines and then the 'row' continues. So, how can I modify my regex for it will parse this 'invalid' lines? Thanks!
Upvotes: 1
Views: 179
Reputation: 626960
You forgot to turn on singleline mode. See 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+)"
It has the inline modifiers in place. (?ms)
means enable singleline (.
matches newline, too) and multiline (^
matches line start and $
matches line end) modes.
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));
Upvotes: 1