Вместо использования .+?
вы можете сопоставить отдельные части, проверяющие значения в начале строки, используя отрицательный прогноз. (?!
Кажется, что денежные значения всегда заканчиваются на запятую, вместо использования \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