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

Regex 查找除最后一个字符串外的所有字符串,并将其删除,regex,google-apps-script,ocr,google-docs,text-manipulation,Regex,Google Apps Script,Ocr,Google Docs,Text Manipulation,我正在使用谷歌文档打开沃尔玛的收据,并通过电子邮件发送给自己。我99.9%使用的沃尔玛商店似乎对Ingenico POS终端进行了一些固件更新,使其在扫描仪识别每个项目后显示一个正在运行的小计。这里有一些图片来支持我的问题 POS终端如下所示: 第二张图片是电子收据,我从他们的IOS应用程序发送电子邮件给自己。它可能来自POS终端,因为它在每个项目后都有额外的运行小计行,如POS终端屏幕所示。它已经这样做了几个月,我没有理由相信管理层会很快纠正它 最终图像是我的实际纸质收据。这是从登记簿打印

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

POS终端如下所示:

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

最终图像是我的实际纸质收据。这是从登记簿打印出来的,您可以带着它走出登记簿,让迎宾/退场人员查看您的马车和您购买的物品

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

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

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

我想做的是从(损坏的)电子收据中删除额外的小计,但保留最后的小计。我强调了收据上的最后一笔小计,它总是在那里,应该保留

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

我试过什么?

以下正则表达式在regex101.com的在线测试仪中工作:

\nSUBTOTAL\t\d{1,3}(?:[.,]\d{3})*(?:[.,]\d{2})
我花了一段时间在搜索中找到了这个正则表达式,但本质上我希望它能找到所有小计文字,前面有一个新行,小数位数在0.01到999.99之间),我只想用一个新行替换找到的内容,然后我可以允许我的其他正则表达式创建像以前一样工作在对POS终端进行固件更新之前

正则表达式正确识别regex101.com站点上的每个小计(包括最后一个小计)。我可以应用“\n”的替换,然后我又可以看到我可以使用的收据数据,但有两个问题:

1) 我无法使用谷歌应用程序脚本复制此内容。 以下是我的例子:

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文档,用于试验:
我使用这个常规表达式

// JavaScript Syntax
'/\nSUBTOTAL\s\d{1,3}\.\d{2}| SUBTOTAL\n\d{1,3}\.\d{2}/g'
我还为谷歌文档制作了一个脚本。您可以使用它并查看结果

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文档文件并单击:

  • 附加组件
  • 删除子节点->删除子节点
提示:在执行补码/附加项(删除子项)后,撤消文档版本,这样其他用户就可以返回到以前版本的文本


希望这对您有所帮助。

使用
文本可以轻松删除除最后一次出现以外的所有内容。替换(/pattern(?=[\s\s]*pattern)/g')
我可以问一下使用Google Apps脚本的预期结果吗?谢谢您的回复。不幸的是,我仍然看不到你期望的结果。我为我糟糕的英语水平道歉。为了正确理解你的目标,你能在你共享的谷歌文档中包含你期望的结果吗?谢谢你的回复。似乎
https://regex101.com/r/UgHg1U/1
与您共享的谷歌文档不同,但它们不同。当共享Google文档的值用于
https://regex101.com/r/UgHg1U/1
,你能得到同样的结果吗?是的,如果正则表达式在线工作,可能有两个原因:1)正则表达式不能“跳过”换行符(跨段落),2)文档中的文本与在线测试仪中测试的文本不同。此处的正则表达式示例:谢谢!这似乎很管用,我需要研究这个正则表达式,并将它合并到我现有的一个正则表达式中,该正则表达式用于格式化数据以加载数据库。