查找所有出现的字符串,除了最后一个找到的,并将它们删除

Find All String Occurrences, Except The Last One Found, and Remove Them

我正在使用 Google 文档打开我通过电子邮件发送给自己的沃尔玛收据。我使用 99.9% 时间的沃尔玛商店似乎对 Ingenico POS 终端进行了一些固件更新,使其在扫描仪识别每件商品后显示 运行 小计。这里有一些图片来支持我的问题..

POS终端是这样的:

第二张图片是电子收据,我通过他们的 IOS 应用程序通过电子邮件发送给自己。它可能是从 POS 终端获取的,因为它在每个项目之后都有额外的 运行 SUBTOTAL 行,就像 POS 终端屏幕显示的那样。它已经这样做了几个月了,我没有理由相信管理层会很快纠正它。

最终图像是我的实际纸质收据。这是从收银机打印的,它是您走出去并向 greeter/exit 人展示的检查您的越野车和您购买的物品。

请注意,它不显示额外的小计。

我在 Google 文档中打开电子收据,他们的自动 OCR 会吐出收据文本。它做得非常好,我想说这些收据的准确率超过 95%。我应用了一个非常粗糙的小正则表达式来重新格式化这些电子收据,以便我可以将它们输入数据库并将该数据用于我家庭的预算、税收等。这对我来说效果很好,尽管我想进一步自动化该过程,但也许有一天会针对不同的问题。

现在,那个简陋的正则表达式不再将收据格式化为对我有用的东西。

我想做的 是从(损坏的)电子收据中删除多余的小计,但保留最后一个小计。我在收据上突出显示了最后一个小计,它总是在那里,应该保留。

我看到了另外两个类似的问题,但我无法将它们应用到我的情况中。其中之一是:

我尝试了什么?

以下正则表达式在 regex101.com 的在线测试器中有效:

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

我花了一段时间才通过四处搜索得出该正则表达式,但本质上我希望它能找到所有带有前面换行符和任何十进制数(从 0.01 到 999.99 的小数)的 SUBTOTAL 文字,我只是想用新行替换找到的内容,然后我可以让我的其他正则表达式创建像在 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) 如果我要让上面的代码工作,我仍然有想要保留最后一个 SUBTOTAL 完整的问题。

这是我设置的 Google 文档,用于试验: https://docs.google.com/document/d/11bOJp2rmWJkvPG1FCAGsQ_n7MqTmsEdhDQtDXDY-52s/edit?usp=sharing

我使用这个正则表达式。

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

我还为 google 文档制作了一个脚本。您可以使用此 Google Doc 并查看结果。

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 -> 删除订阅。

提示: 执行complement/add on (Deleting Subs)后,撤销文档编辑,其他方式用户可以return到以前版本的文字。

希望对您有所帮助。