Регулярное выражение в скрипте Google для получения цифр после определенных слов

У меня есть скрипт приложения 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
    

Спасибо заранее за любую помощь.

Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
0
72
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы можете использовать:

^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 12.02.2023 14:57

@user1128912 user1128912 В используемом вами сценарии вы можете извлечь значения группы захвата? Какой сценарий вы используете?

The fourth bird 12.02.2023 16:43

это сценарий, который я использую. Возможно, мне следует найти способ либо использовать каждую группу захвата, либо объединить данные в конце, потому что с некоторыми небольшими изменениями ваш код работает с 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; } };'

user1128912 12.02.2023 21:02

Я собираюсь отметить ваш ответ как правильный, потому что с некоторыми незначительными изменениями регулярное выражение извлекло то, что я хотел, и я также обновил скрипт (который не был частью запроса)

user1128912 12.02.2023 22:05

Другие вопросы по теме