Найти все вхождения строк, кроме последнего найденного, и удалить их

Я использую Документы Google, чтобы открывать квитанции Walmart, которые я отправляю себе по электронной почте. Магазин Walmart, который я использую в 99,9% случаев, похоже, сделал некоторое обновление прошивки для POS-терминала Ingenico, которое заставляет его отображать текущий ПРОМЕЖУТОЧНЫЙ ИТОГ после того, как сканер идентифицирует каждый элемент. Вот несколько изображений, чтобы поддержать мой вопрос.

POS-терминал выглядит следующим образом:

введите здесь описание изображения

Второе изображение — это электронная квитанция, которую я отправил себе по электронной почте из их приложения для iOS. Предположительно, он взят из POS-терминала, потому что у него есть дополнительные строки ПРОМЕЖУТОЧНЫХ ИТОГОВ после каждого элемента, как показано на экране POS-терминала. Это происходит в течение нескольких месяцев, и руководство не дало мне никаких оснований полагать, что это будет исправлено в ближайшее время.

введите здесь описание изображения

Последнее изображение — это моя настоящая бумажная квитанция. Это распечатано из кассы, это та, с которой вы выходите и показываете встречающему/выходящему человеку, чтобы он проверил вашу коляску и купленные вами предметы. .

Обратите внимание, что он не показывает дополнительный ПРОМЕЖУТОЧНЫЙ ИТОГ.

введите здесь описание изображения

Я открываю электронную квитанцию ​​​​в документе Google, и их автоматическое распознавание текста выдает текст квитанции. Он делает чертовски хорошую работу, я бы сказал, что с этими чеками он точен на 95%+. Я применяю очень грубое небольшое регулярное выражение, которое переформатирует эти электронные квитанции, чтобы я мог ввести их в базу данных и использовать эти данные для составления бюджета моей семьи, налогов и так далее. Это очень хорошо работает для меня, хотя я хотел бы еще больше автоматизировать этот процесс, но, возможно, когда-нибудь это будет другой вопрос.

Прямо сейчас это маленькое грубое регулярное выражение больше не форматирует квитанцию ​​во что-то полезное для меня.

Что я хотел бы сделать, так это удалить лишние ПРОМЕЖУТОЧНЫЕ ИТОГОВ из (сломанной) электронной квитанции, но оставить только последний ПРОМЕЖУТОЧНЫЙ ИТОГ. Я выделил в чеке последний ПРОМЕЖУТОЧНЫЙ ИТОГ, который всегда есть, и должен оставаться.

Я видел два других вопроса, которые похожи, но я не мог применить их к своей ситуации. Одним из них было: Удалить все вхождения, кроме последнего

Что я пробовал?

Следующее регулярное выражение работает в онлайн-тестере на regex101.com:

\nSUBTOTAL\t\d{1,3}(?:[.,]\d{3})*(?:[.,]\d{2})

Мне потребовалось некоторое время, чтобы найти это регулярное выражение из поиска, но, по сути, я хочу, чтобы оно нашло все литералы ПРОМЕЖУТОЧНЫХ ИТОГОВ с предшествующей новой строкой и любым десятичным числом от 0,01 до 999,99), и я просто хочу заменить то, что находит с новой строкой, а затем я могу позволить своему другому созданию регулярного выражения работать над этим, как это было до обновления прошивки для POS-терминала.

Регулярное выражение правильно определяет каждый ПРОМЕЖУТОЧНЫЙ ИТОГ (включая последний) на сайте regex101.com. Я могу применить замену «\n», и я снова увижу данные квитанции, с которыми я могу работать, но есть две проблемы:

1) Я не могу воспроизвести это с помощью скрипта Google Apps. Вот мой пример:

function myFunction() {
  var body = DocumentApp.getActiveDocument().getBody();
  var newText = body.getText()
    .match('\nSUBTOTAL\t\d{1,3}(?:[.,]\d{3})*(?:[.,]\d{2})')[1]
    .replace(/%/mgi, "%\n");
  body.clear();
  body.setText(newText);
}

2) Если бы мне нужно было заставить приведенный выше код работать, у меня все еще была бы проблема с желанием оставить последний ПРОМЕЖУТОЧНЫЙ ИТОГ нетронутым.

Вот документ Google, который я настроил для экспериментов: https://docs.google.com/document/d/11bOJp2rmWJkvPG1FCAGsQ_n7MqTmsEdhDQtDXDY-52s/edit?usp=sharing


person ONDEV    schedule 19.12.2019    source источник
comment
Удалить все, кроме последнего вхождения, легко с помощью text.replace(/pattern(?=[\s\S]*pattern)/g, '')   -  person Wiktor Stribiżew    schedule 20.12.2019
comment
Могу я спросить вас о результате, который вы ожидаете от использования Google Apps Script?   -  person Tanaike    schedule 20.12.2019
comment
Привет @Tanaike, я хочу удалить все строки ПРОМЕЖУТОЧНЫХ ИТОГОВ, включая эту сумму рядом с ней - я должен был упомянуть об этом (!) Но оставить нетронутым последний ПРОМЕЖУТОЧНЫЙ ИТОГ + десятичную сумму. Итак, 2-е изображение со всеми этими строками ПРОМЕЖУТОЧНЫХ ИТОГОВ должно выглядеть как 3-е изображение только с одной строкой ПРОМЕЖУТОЧНЫХ ИТОГОВ. Таким образом, в приведенном выше случае единственная строка ПРОМЕЖУТОЧНЫХ ИТОГОВ, которая должна остаться, это ПРОМЕЖУТОЧНЫЕ ИТОГОВ 80,17.   -  person ONDEV    schedule 20.12.2019
comment
Спасибо за ответ. К сожалению, я все еще не могу увидеть результат, который вы ожидаете. Прошу прощения за мое плохое знание английского. Чтобы правильно понять свою цель, можете ли вы включить ожидаемый результат в общий документ Google?   -  person Tanaike    schedule 20.12.2019
comment
@Tanaike конечно, не проблема. Работаю над этим сейчас   -  person ONDEV    schedule 20.12.2019
comment
@Tanaike Я внес запрошенные вами изменения.   -  person ONDEV    schedule 20.12.2019
comment
@WiktorStribiżew ваше предложение работает на regex101.com (regex101.com/r/UgHg1U/1), но по какой-то причине я не могу реализовать это в скрипте Google Apps в функции: function tryWiktor() { var body = DocumentApp.getActiveDocument().getBody(); var newText = body.getText() newText.replace(/\nПРОМЕЖУТОЧНЫЕ.ИТОГИ\t\d{1,3}(?:[.,]\d{3})*(?:[.,]\d{2} )(?=[\s\S]*\nПРОМЕЖУТОЧНЫЙ ИТОГ\t\d{1,3}(?:[.,]\d{3})*(?:[.,]\d{2})) /g, '') body.clear(); body.setText (новый текст); }   -  person ONDEV    schedule 20.12.2019
comment
Спасибо за ответ. Кажется, что пример значения https://regex101.com/r/UgHg1U/1 отличается от вашего общего документа Google. Когда значение вашего общего документа Google используется для https://regex101.com/r/UgHg1U/1, можете ли вы получить тот же результат?   -  person Tanaike    schedule 20.12.2019
comment
Да, если регулярное выражение работает онлайн, могут быть две причины: 1) регулярное выражение не может перейти через разрыв строки (через абзацы), 2) у вас в документе текст, отличный от того, который вы тестировали в онлайне. тестер.   -  person Wiktor Stribiżew    schedule 20.12.2019
comment
@Tanaike пример regex101.com/r/UgHg1U/1 был примером того, что Виктор Стрибижев предоставил. Чтобы ответить вам обоим, все, что работает на regex101.com, похоже, не работает в Документе Google, и Виктор считает, что это может быть связано с разрывом строки, поэтому я собираюсь это выяснить.   -  person ONDEV    schedule 20.12.2019


Ответы (1)


Я использую это регулярное выражение.

// JavaScript Syntax
'/\nSUBTOTAL\s\d{1,3}\.\d{2}| SUBTOTAL\n\d{1,3}\.\d{2}/g'

Также я делаю скрипт для google docs. Вы можете использовать этот Документ Google и посмотреть результаты.

function deleting_subs() {
  var body = DocumentApp.getActiveDocument().getBody();
  var newText = body.getText();

  var out = newText.replace(/\nSUBTOTAL\s\d{1,3}\.\d{2}|` SUBTOTAL\n\d{1,3}\.\d{2}/g, '');

  // This is need to become more readable the resulting text.
  out = out.replace(/R /g, 'R\n');

  body.clear();
  body.setText(out);
}

Чтобы выполнить скрипт, откройте файл документа Google и нажмите:

  • Дополнения.
  • Del_subs -> Удаление подписок.

Совет: после выполнения дополнения/дополнения (удаление подписок) отменить редакцию документа, чтобы другие пользователи могли вернуться к предыдущей версии текста.

Надеюсь, это поможет вам.

person Franco Gil    schedule 20.12.2019
comment
Пример регулярного выражения здесь: regex101.com/r/3cld6B/2 - person Franco Gil; 20.12.2019
comment
Благодарю вас! Кажется, это помогает, мне нужно будет изучить это регулярное выражение и включить его в существующее, которое форматирует данные для загрузки базы данных. - person ONDEV; 20.12.2019