Регулярное выражение для сопоставления номера после возврата каретки с текстом между ними

#regex #invoice

#регулярное выражение #счет-фактура

Вопрос:

Есть ли способ сопоставить такой шаблон в строке?

Шаблон (без учета регистра): "bfactuur(nummer)" **OR** "Nr." **OR** "Nr(:)" за которым следует фактическое значение "d " ИЛИ "d{3,4} - d{3,4}" .

Приятно иметь (если это на самом деле не сюрреалистично): "Factuurn" игнорировать все промежуточное "Nr." "d " .

Проверено на:

 Factuur: 2018-4005 

Factuur

Nr. 90424571 

 Factuurnummer: 2019-010

 factuur : 281319261

factuurnummer: 63

Factuurnummer: 281319264565

Factuur assdg 236373

   Factuurnummer 281319265

Factuurnummer 0723 - 1345

Factuur nr. 180262

Factuurnummer : 6322232
  

ДЕМОНСТРАЦИОННОЕ регулярное выражение:

https://regex101.com/r/PuGrqn/37

Ответ №1:

Вашему регулярному выражению просто понадобились следующие два изменения, чтобы заставить его работать для всех ваших образцов. Вы можете использовать это регулярное выражение,

 bfactuur(?:nummer|n)?.*?(?<=s)(d (?:s*-s*d )?)(?=s|$)
  

Проверьте онлайн-демонстрацию

Вот два изменения, которые я сделал,

  • Если за фактом может сразу следовать новая строка, кроме того nummer , тогда просто поставьте n вместо nummer
  • Улучшите (d ) до (d (?:s*-s*d )?) , чтобы оно позволяло не только сопоставлять числа, но также необязательно сопоставлять некоторые необязательные пробелы, затем дефис, затем снова некоторые необязательные пробелы, за которыми, наконец, следует число, поэтому я добавил (?:s*-s*d )? после d

Надеюсь, это решит проблемы. Дайте мне знать, если у вас есть еще какие-либо примеры, которые не соответствуют.

Редактировать: Для записи строки, подобной этой

 Factuurnummer Factuurdate 1234 3-21-2019
  

Шаблон может быть улучшен для захвата нескольких чисел, разделенных пробелом или дефисом, с помощью этого регулярного выражения,

 bfactuur(?:nummer|n)?.*?(?<=s)(d (?:s*-?s*d )*)(?=s|$)
  

Проверьте эту демонстрацию с дополнительными образцами данных

Комментарии:

1. спасибо, я пытаюсь выяснить, как сделать работу со строкой значительно надежной с помощью regex. У меня есть различные строки, и factuurnummer является одним из полей, которые я хочу извлечь. В этом конкретном случае использования это работает, хотя я предполагаю, что могут быть некоторые препятствия с другими строками, что означает, что мне всегда приходится корректировать шаблоны. Есть ли здесь какой-либо обходной путь? В исходном PDF-файле могут быть таблицы, но выходная строка будет печататься построчно. Итак, в этом случае это выглядело бы так: Фактическое число, фактическая дата 1234 3-21-2019

2. @rumba: Я понимаю, когда иногда текстовые данные большие, и вы не уверены, как сопоставить / отфильтровать нужные данные. Но я предполагаю, что вам либо нужно будет указать обоснование того, во всех каких случаях существуют данные, чтобы можно было разработать правила для составления правильного регулярного выражения, либо вам, возможно, придется предоставить достаточное количество примеров, чтобы охватить все ваши случаи. Если вы знаете основы регулярных выражений, некоторые настройки вы можете сделать сами, а для других я могу вам помочь. Это должно быть хорошим способом, поскольку это также улучшит ваши навыки.

3. Я ищу способы добавить «Factuurbedrag» к существующему регулярному выражению для поиска значения перед ним. factuurbedrag = totaal . Вот то, что нужно для поиска Totaal ( regex101.com/r/PuGrqn/41 ) Я не хочу, чтобы оно оставалось прежним. Вот регулярное выражение для Factuurbedrag ( regex101.com/r/PuGrqn/42 ) он также ошибочно выводит все после factuurbedrag. Как это можно изменить и добавить к шаблону main — totaal?

4. @rumba: Я не уверен, что понял ваш вопрос, но хотите ли вы фиксировать число во всех случаях, упомянутых в ваших входных данных? Проверьте это Здесь оно фиксирует число либо до, либо после и будь то totaal или Factuurbedrag . Дайте мне знать, если это то, что вы хотели.

5. Именно это я и пытался выяснить, ценю это