Я использую Документы 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
text.replace(/pattern(?=[\s\S]*pattern)/g, '')
- person Wiktor Stribiżew   schedule 20.12.2019https://regex101.com/r/UgHg1U/1
отличается от вашего общего документа Google. Когда значение вашего общего документа Google используется дляhttps://regex101.com/r/UgHg1U/1
, можете ли вы получить тот же результат? - person Tanaike   schedule 20.12.2019