【问题标题】:Find All String Occurrences, Except The Last One Found, and Remove Them查找所有字符串出现,除了最后一个找到,并删除它们
【发布时间】:2020-04-12 12:02:14
【问题描述】:

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

POS 终端如下所示:

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

最后的图片是我的实际纸质收据。这是从收银台打印出来的,你带着它走出去,让迎宾员/出口人员检查你的车和你的物品已购买。

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

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

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

我想要做的是从(损坏的)电子收据中删除额外的小计,但不理会最后一个小计。我突出显示了收据上的最后一个小计,它始终存在并且应该保留。

我看到了另外两个类似的问题,但我无法将它们应用于我的情况。其中之一是: Remove all occurrences except the last one

我尝试了什么?

以下正则表达式可在 regex101.com 的在线测试器中使用:

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

我花了一段时间才想出那个正则表达式,但基本上我希望它找到所有带有前面换行符和从 0.01 到 999.99 的任何十进制数的 SUBTOTAL 文字,我只是想用新行替换找到的内容,然后我可以让我的其他正则表达式创建像以前一样在 POS 终端固件更新之前工作。

正则表达式正确识别了 regex101.com 网站上的每个 SUBTOTAL(包括最后一个)。我可以应用“\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 Doc: https://docs.google.com/document/d/11bOJp2rmWJkvPG1FCAGsQ_n7MqTmsEdhDQtDXDY-52s/edit?usp=sharing

【问题讨论】:

  • 使用text.replace(/pattern(?=[\s\S]*pattern)/g, '')删除除最后一个之外的所有内容很容易
  • 我能问一下您使用 Google Apps 脚本所期望的结果吗?
  • 感谢您的回复。不幸的是,我仍然看不到您期望的结果。我为我糟糕的英语水平道歉。为了正确理解您的目标,您能否在共享的 Google 文档中包含您期望的结果?
  • 感谢您的回复。 https://regex101.com/r/UgHg1U/1 的样本值似乎与您共享的 Google 文档不同。当你共享的谷歌文档的值用于https://regex101.com/r/UgHg1U/1时,你能得到同样的结果吗?
  • 是的,如果正则表达式在线工作,可能有两个原因:1)正则表达式不能“跳过”换行符(跨段落),2)您在比您在在线测试仪中测试的文档。

标签: regex google-apps-script ocr google-docs text-manipulation


【解决方案1】:

我使用这个正则表达式。

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

我还为谷歌文档制作了一个脚本。您可以使用此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 doc 文件并点击:

  • 附加组件。
  • Del_subs -> 删除 Subs。

提示:在执行补/加(删除子)后,撤消文档的编辑,这样其他用户可以返回到之前的文本版本。

希望对您有所帮助。

【讨论】:

  • 这里的正则表达式示例:regex101.com/r/3cld6B/2
  • 谢谢!这似乎可以解决问题,我需要研究该正则表达式并将其合并到我现有的用于格式化数据以供数据库加载的表达式中。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-07-25
  • 2019-10-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-27
相关资源
最近更新 更多