我有这个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}))?
但它不工作,我不知道为什么。
如果 (?:DeliveryDate:\s(\d{2}.\d{2}.\d{4}))?
不匹配,那么,regex仍然期望得到 .+?
前后仍要匹配。
试着把结尾放在 .+?
内的非捕获组,您的交付日期。
(?:DeliveryDate:\s(\d{2}.\d{2}.\d{4}).+?)?
而不是使用 .+?
您可以在行首使用负向的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}))?