Regex 查找除最后一个字符串外的所有字符串,并将其删除
我正在使用谷歌文档打开沃尔玛的收据,并通过电子邮件发送给自己。我99.9%使用的沃尔玛商店似乎对Ingenico POS终端进行了一些固件更新,使其在扫描仪识别每个项目后显示一个正在运行的小计。这里有一些图片来支持我的问题 POS终端如下所示: 第二张图片是电子收据,我从他们的IOS应用程序发送电子邮件给自己。它可能来自POS终端,因为它在每个项目后都有额外的运行小计行,如POS终端屏幕所示。它已经这样做了几个月,我没有理由相信管理层会很快纠正它 最终图像是我的实际纸质收据。这是从登记簿打印出来的,您可以带着它走出登记簿,让迎宾/退场人员查看您的马车和您购买的物品 请注意,它不显示额外的小计 我打开谷歌文档中的电子收据,他们的自动OCR会显示收据文本。它做得非常好,我认为这些收据准确率高达95%。我使用了一个非常粗糙的小正则表达式来重新格式化这些电子收据,这样我就可以将它们输入数据库,并将这些数据用于我的家庭预算、税收等等。这对我来说非常有效,尽管我想进一步自动化这个过程,但也许有一天会有不同的问题 现在,那个小小的原始正则表达式不再将收据格式化为对我有用的格式 我想做的是从(损坏的)电子收据中删除额外的小计,但保留最后的小计。我强调了收据上的最后一笔小计,它总是在那里,应该保留 我看到了另外两个类似的问题,但我无法将它们应用于我的情况。其中一项是: 我试过什么? 以下正则表达式在regex101.com的在线测试仪中工作: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终端屏幕所示。它已经这样做了几个月,我没有理由相信管理层会很快纠正它 最终图像是我的实际纸质收据。这是从登记簿打印
\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)文档中的文本与在线测试仪中测试的文本不同。此处的正则表达式示例:谢谢!这似乎很管用,我需要研究这个正则表达式,并将它合并到我现有的一个正则表达式中,该正则表达式用于格式化数据以加载数据库。