regex - 谷歌脚本:将正则表达式匹配到二维数组
问题描述
我正在尝试将 Gmail 中的信息提取到 Google 电子表格中。电子邮件中的信息具有表格结构,其中包含以下列产品列表、已售数量和每个产品的小计。这些重复N次。
使用访问信息时,message.getPlainBody()
我得到以下文本:
Product
Quantity
Price
Chocolate
1
$8.58
Apples
2
$40.40
Bananas
1
$95.99
Candy
1
$4.99
Subtotal:
$149.96
进步
首先,我尝试使用正则表达式来识别每一行的所有元素:
- 产品名称:不包括':' (.*)[^:] 的任意数量的字符
- 售出数量:任意数量 \d*
- 任何看起来像 SubTotal [$]\d*.\d*
把所有东西都包起来看起来像这样
function ExtractDetail(message){
var mainbody = message.getPlainBody();
//RegEx
var itemListRegex = new RegExp(/(.*)[^:][\r\n]+(\d*[\r\n]+[$](\d*\.\d*)[\r\n]+/g);
var itemList = mainbody.match(itemListRegex);
Logger.log(itemList);
}
到目前为止它有效:
itemList: 巧克力 1 $8.58 , 苹果 2 $40.40 , 香蕉 1 $95.99 , 糖果 1 $4.99
但是,我得到以下结果:
- [巧克力 1 美元 8.58 美元]
- [苹果 2 美元 40.40 美元]
- [香蕉 1 美元 95.99 美元]
- [糖果1 $4.99]
代替:
- [巧克力] [ 1 ] [$8.58]
- [苹果] [ 2 ] [$40.40]
- [香蕉] [ 1 ] [$95.99]
- [糖果] [ 1 ] [$4.99]
问题
我的问题是,如何以每行对应于找到的每个匹配并且每列对应于每个属性的方式追加新行?
如何将每个匹配的结果转换为数组?有可能还是我应该改变我的方法?
更新:
由于我当前尝试的结果是一个大字符串,我正在尝试寻找其他选项。出现了这个:
var array = Array.from(mainbody.matchAll(itemListRegex), m => m[1]);
来源:您如何访问 JavaScript 正则表达式中的匹配组?
我还在努力。我仍然需要找到如何添加更多列,并且由于某种原因它从“Apples”开始(按照示例),而将“Chocolates”留在后面。
日志:
Logger.log('array: ' + array);
解决方案
如果你想使用matchAll
like Array.from(mainbody.matchAll(itemListRegex), m => m[1])
,这个修改怎么样?
在这种情况下,/(.*[^:])[\r\n]+(\d*)[\r\n]+([$]\d*\.\d*)[\r\n]/g
用作正则表达式。
修改后的脚本:
const itemListRegex = /(.*[^:])[\r\n]+(\d*)[\r\n]+([$]\d*\.\d*)[\r\n]/g;
var array = Array.from(mainbody.matchAll(itemListRegex), ([,b,c,d]) => [b,Number(c),d]);
结果:
[
["Chocolate",1,"$8.58"],
["Apples",2,"$40.40"],
["Bananas",1,"$95.99"],
["Candy",1,"$4.99"]
]
- 结果与TheMaster的答案相同。
脚本测试:
const mainbody = `
Product
Quantity
Price
Chocolate
1
$8.58
Apples
2
$40.40
Bananas
1
$95.99
Candy
1
$4.99
Subtotal:
$149.96
`;
const itemListRegex = /(.*[^:])[\r\n]+(\d*)[\r\n]+([$]\d*\.\d*)[\r\n]/g;
var array = Array.from(mainbody.matchAll(itemListRegex), ([,b,c,d]) => [b,Number(c),d]);
console.log(array)
笔记:
- 关于
how can I append a new row in a way that it each row corresponds to each match found and that each column corresponds to each property?
,这意味着将值放入电子表格?如果是这样,您能否提供您期望的样本结果?
参考:
推荐阅读
- apache-spark - Pyspark - from_unixtime 未显示正确的日期时间
- vuejs2 - FontAwesome Regular Vuetify
- sql-server - Docker 上的 MSSQL 立即退出
- python - multiprocessing.cpu_count 和 os.cpu_count 的区别
- java - 删除使用 GSON 创建的 JSON 字符串中的双引号
- javascript - 使用three.js的视差效果
- performance - 快速比较列表与自身
- python - 熊猫:将nan连续转换为空数组
- c# - 这是使用 EAV 还是不使用的好案例
- javascript - AutoNumeric - 在 Ajax 调用后设置一个值