构建复杂的正则表达式

时间:2016-05-10 21:17:36

标签: regex

我已经构建了一个正则表达式(在.NET中):

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

用于解析文件,如:

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

正如你所看到的那样排成一排'来自源文件包含一个'表'。匹配的结果如下:

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
...

但源文本可以包含以下内容:

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

正如我们在第二组(.*)之后看到的那样,我们有一个新的行,然后是'行'继续。那么,我怎样才能修改我的正则表达式呢?它会解析这个“无效的”#39;行呢?谢谢!

1 个答案:

答案 0 :(得分:1)

您忘了打开单线模式。见this article

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

它具有内联修饰符。 (?ms)表示启用单行(.匹配换行符)和多行(^匹配行开头,$匹配行结束)模式。

my regex

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));