Regex 构建复杂正则表达式

Regex 构建复杂正则表达式,regex,Regex,我已经构建了一个正则表达式(在.NET中): 用于解析文件,如: 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 47

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

用于解析文件,如:

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

正如我们在第二组
(.*)
之后看到的,我们有一个新行,然后“行”继续。那么,我如何修改我的正则表达式,因为它将解析这个“无效”行?谢谢

您忘了打开单线模式。见:

它具有内联修改器<代码>(?ms)表示启用单线(
也匹配换行符)和多线(
^
匹配行开始和
$
匹配行结束)模式

:

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番茄酱1,2kg 1000 tk 12,63 10,53 0,00 10,53 10,53\nC41735 8711200567249 Pakendis 6,00\n17 PÄHKLINÄPP Kuivatatud aprikoosid 500g 1000 tk 3,48 2,90 0,00 2,90\nC74424 47501950272 Pakendis 12,00\n18 P Kuivatatud Mustomid\n1000塔卡3,15 2,63 0,00 2,63 2,63\nC74423 4750195020289帕肯迪斯12,00\n19卢蒂克海军陆战队使用530g(klaas)1000塔卡1,74 1,45 0,00 1,45 1,45\nC40070 880730110879帕肯迪斯12,00\nPrt。\\18.09.18卡巴·吉尔吉斯塔·塔加米塞克·梅尔吉斯塔诉伊丽莎·科雷特塞尔特·奥斯特党”;
var res=Regex.Matches(str,re)
.Cast()
.选择(m=>m.Value)
.ToList();
Console.WriteLine(string.Join(“\n”,res));

试试
(?ms)^(\d+)\s+.\s+(\d+,\d+)\s+(\d+,\d+)\s+(\d+,\d+)\s+(\d+,\d+,\d+)\s+(\d+,\d+)\s+(\d+,\d+,\d+)
。请参阅goo.gl/rIvT1wI尝试使用我的文件,但它与这一行不匹配。这里用u表达式表示部分源数据。正如我们看到的18排不匹配。请参见goo.gl/krbe4c您忘记打开单线模式。查看我的正则表达式:它有内联修饰符<代码>(?ms)表示启用单线和多线模式。使用正则表达式时不要将其丢弃。请参阅我发布的答案。
18 PÄHKLINÄPP Kuivatatud mustad ploomid 
500g(kivideta)
1,000 tk 3,15 2,63 0,00 2,63 2,63
@"(?ms)^(\d+)\s+.*?\s+(\d+,\d+)\s+(tk|kg)\s(\d+,\d+)\s+(\d+,\d+)\s+(\d+,\d+)\s+(\‌​d+,\d+)\s+(\d+,\d+)"
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));