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

问题描述 投票:1回答:1

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

POS终端看起来像这样:

enter image description here

第二张图片是电子收据,我从他们的IOS应用中通过电子邮件发送给自己。大概是从POS终端获取的,因为它在POS终端屏幕之类的每个项目之后都有多余的SUBTOTAL行。它已经这样做了几个月,而且我没有理由相信管理层会尽快纠正它。

enter image description here

最后一张图像是我的实际纸质收据。这是从收银机上打印出来的,它是您随身带走的那张纸,并向迎宾员/退出者显示检查您的越野车和所购物品的信息。

请注意,它不显示多余的小计。

enter image description here

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

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

[我想做的事情是从(破损的)电子收据中删除多余的小计,但不要留下最后一个小计。我突出显示了收据上的最后一个小计,它始终存在并且应该保留。

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

我尝试了什么?

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

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

花了我一段时间才找到正则表达式,但从本质上讲,我希望它能找到所有SUBTOTAL文字和前面的换行符以及从0.01到999.99之间的任何十进制数字),我只想替换用换行符找到的内容,然后我可以允许我的其他正则表达式创建像以前一样在固件更新到POS终端之前进行处理。

regex可以正确识别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

regex google-apps-script ocr google-docs text-manipulation
1个回答
2
投票

我使用这个常规表达式。

// 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 doc文件,然后单击:

  • 附加项。
  • Del_subs->删除订阅。

提示:在对文档版本进行补充/删除(删除子项)后,撤消,这样其他用户可以返回到文本的先前版本。

希望对您有帮助。

© www.soinside.com 2019 - 2024. All rights reserved.