正则表达式:可选组不工作

问题描述 投票:0回答:1

我有这个regEx。

\1/n1/s(d{2,8})/s(d{0,3}(.d{3}),\d)/s(\w{1,10})/s(\d{0,3}(.\d{3}),\d)/s(d{0,3}(.d{3}),\d)/s(\w{3}).+??Ihre Art.-Nr.\s(\d+).+?(?:DeliveryDate:\s(\d{2}.\d{2}.\d{4})).+?(?:ExtraCharge.+?entspricht:\s(\d{0,3}(.\d{3}),\d)/s(\w{1,10}))

到目前为止,工作正常。它符合这样的东西。

1 123456 25,00 Stck 100,00 2. 500,00 EUR (欧元)

. .一些案文

Ihre Art.-Nr. 1690431

交付日期:2019年11月21日。

. .一些案文

包括额外费用

符合:222,00欧元

现在,我希望粗体部分是可选的(在某些情况下,文档中没有值)。

我的想法是给这些组添加一个问号。

\1/n1/s(\d{2,8})\s(\d{0,3}(.\d{3}),\d)/s(\w{1,10})/s(\d{0,3}(.\d{3}),\d)/s(d{0,3}(.d{3}),\d)/s(\w{3}).+?Ihre Art.-Nr.\s(\d+).+?(?:交货日期:\s(\d{2}.\d{2}.\d{4}))?.+?(?:ExtraCharge.+?entspricht:\s(\d{0,3}(.\d{3}),\d)/s(\w{1,10}))?

但它不工作,我不知道为什么。

regex optional regex-group
1个回答
1
投票

如果 (?:DeliveryDate:\s(\d{2}.\d{2}.\d{4}))? 不匹配,那么,regex仍然期望得到 .+? 前后仍要匹配。

试着把结尾放在 .+? 内的非捕获组,您的交付日期。

(?:DeliveryDate:\s(\d{2}.\d{2}.\d{4}).+?)?


1
投票

而不是使用 .+?您可以在行首使用负向的lookahead来检查各部分的值。(?!

似乎像钱这样的值总是以逗号结尾,而不是使用 \d{0,3}(\.\d{3})*,\d* 可与 .123, 你可以用 \d{1,3}(?:\.\d{3})*(?:\,\d+) 而不是。

假设 incl. 始终存在,您可以将其作为模式中的一个标记,至少在该部分之前进行匹配。

您仍然可以使用可选的组来匹配DeliveryDate和ExtraCharge。

(?:DeliveryDate:\s(\d{2}.\d{2}.\d{4}))?(?:ExtraCharge\r?\n\s*entspricht:\s(\d{1,3}(?:\.\d{3})*(?:\,\d+))\s(\w{1,10}))?

整个模式可能是这样的。

\n1\s(\d{2,8})\s(\d{1,3}(?:\.\d{3})*(?:\,\d+))\s(\w{1,10})\s(\d{1,3}(?:\.\d{3})*(?:\,\d+))\s(\d{1,3}(?:\.\d{3})*(?:\,\d+))\s(\w{3})(?:\r?\n(?!Ihre).*)*\r?\nIhre Art.-Nr.\s(\d+)(?:\r?\n(?!DeliveryDate:|incl\.).*)*\r?\n(?:DeliveryDate:\s(\d{2}.\d{2}.\d{4}))?(?:\r?\n(?!incl\.).*)*\r?\nincl\.(?:ExtraCharge\r?\n\s*entspricht:\s(\d{1,3}(?:\.\d{3})*(?:\,\d+))\s(\w{1,10}))?

Regex demo

© www.soinside.com 2019 - 2024. All rights reserved.