У меня есть скрипт приложения Google, который анализирует некоторые PDF-файлы, и я начал со следующего регулярного выражения, которое извлекает 5 наборов 3 цифр из тега Reference
:
[w,W,s,S]*(\d{3}).?(\d{3}).?(\d{3}).?(\d{3}).?(\d{3})
Я добавил к нему больше гибкости, чтобы также получить комбинацию из 9 цифр для тега Reference
;
[w,W,s,S]*(\d{3}).?(\d{3}).?(\d{3}).?(\d{3})?.?(\d{3})?
Обе версии совпадают только по цифрам, без слов, что идеально.
Я также хотел бы получить цифры, относящиеся к тегу Amount
, игнорируя при этом любые слова и цифры между ними. И вот тут у меня проблемы.
Я пытался:
.*?(?:Ref)(?:.*:) ? ?(\d{3}).?(\d{3}).?(\d{3}).?(\d{3})?.?(\d{3})?
Но оно уже начинает включать в себя слово.
Это пример фиктивного текста, в котором используется регулярное выражение:
после каждого «тега» может быть больше слов (пример: Reference of something
// Amount of first payment
:)
может быть :
или нет
Some dummy text that may have words in common like `reference` or `amount` throughout the document
Reference: 245 154 343 345 345
Entity: 34567
Amount: 11,11
Payment date: 14/07/2022
Some more text
Спасибо заранее за любую помощь.
Вы можете использовать:
^Reference:?[\t ]+(\d{3})[\t ]*(\d{3})[\t ]*(\d{3})[\t ]*(\d{3})[\t ]*(\d{3})(?:\n(?!Amount)\S.*)*\nAmount:?[\t ]+(\d+(?:,\d+)?)\b
Посмотрите демоверсию regex101.
Или, принимая во внимание Reference of something // Amount of first payment:
, вы можете использовать [^\d\n]*
для соответствия любому символу, кроме цифр или новой строки:
^Reference\b[^\d\n]*[\t ](\d{3})[\t ]*(\d{3})[\t ]*(\d{3})[\t ]*(\d{3})[\t ]*(\d{3})(?:\n(?!Amount\b)\S.*)*\nAmount\b[^\d\n]*[\t ](\d+(?:,\d+)?)\b
Объяснение
^
Начало строкиReference\b
Подберите слово Reference
[^\d\n]*[\t ]
Сопоставьте необязательные символы, кроме цифры или новой строки, а затем сопоставьте либо пробел, либо табуляцию (вы также можете использовать \s*
, но это также может соответствовать новой строке)(\d{3})[\t ]*(\d{3})[\t ]*(\d{3})[\t ]*(\d{3})[\t ]*(\d{3})
Сопоставьте группу захвата 1 с группой захвата 5, содержащей цифры, с пробелом или табуляцией между ними.(?:
Группа без захвата
\n(?!Amount\b)
Соответствует новой строке и не утверждает слово Amount
справа\S.*
Соответствует символу без пробелов, за которым следует остальная часть строки)*
Закройте группу без захвата и, при желании, повторите ее.\nAmount\b
Сопоставьте новую строку и слово Amount
[^\d\n]*[\t ]
Сопоставьте необязательные символы, кроме цифры или новой строки, а затем сопоставьте либо пробел, либо табуляцию.(\d+(?:,\d+)?)
Захватите группу 6, сопоставьте 1+ цифр и, при желании, запятую с 1+ цифрами\b
Граница слов для предотвращения частичного совпадения словСмотрите еще одну демонстрацию regex101.
@user1128912 user1128912 В используемом вами сценарии вы можете извлечь значения группы захвата? Какой сценарий вы используете?
это сценарий, который я использую. Возможно, мне следует найти способ либо использовать каждую группу захвата, либо объединить данные в конце, потому что с некоторыми небольшими изменениями ваш код работает с regex101. 'функция извлеченияPDFtext(текст){ const regexp = /[w,W,s,S]*(\d{3}).?(\d{3}).?(\d{3}).?(\ d{3})?.?(\d{3})?[\w\W]*?(\d+.\d+)/gm; try{ let array = [...text.match(regexp)]; возвращаемый массив; }catch(e){ let array = ["Элементы не найдены"] return array; } };'
Я собираюсь отметить ваш ответ как правильный, потому что с некоторыми незначительными изменениями регулярное выражение извлекло то, что я хотел, и я также обновил скрипт (который не был частью запроса)
Спасибо за ваш вклад. Тем не менее, это приводит к тем же проблемам, с которыми я сталкивался, потому что, когда я использую регулярное выражение в своем скрипте, я получаю полное совпадение (слова + цифры), когда мне нужны только цифры. Мне нужно либо настроить регулярное выражение, либо как-то настроить скрипт, чтобы иметь возможность использовать группы захвата, а не полное совпадение.