javascript - Javascript拆分正则表达式捕获分隔符
问题描述
我在这里接受的答案中使用正则表达式(Split a string by commas but ignore commas within double-quotes using Javascript)来分割我的 CSV 文件,除了结果
.split(/(".*?"|[^",\s]+)(?=\s*,|\s*$)/g)
正在返回逗号分隔符。我仍然是编写自己的 RegEx 的新手,似乎无法从结果中取出逗号。我尝试了多种创建非捕获组的方法,但没有运气,例如:
.split(/((?:(".*?")|(?:[^",\s])+))(?=\s*,|\s*$)/)
就其价值而言,当我从数据中创建一个键:值对对象时会产生问题,因为我最终会得到许多像“,:”这样的对。
这是其中一个 CSV 记录的示例(还有更多字段,但这抓住了要点和在某些描述性字段中使用逗号和双引号引起的挑战):
-1821151,03/18/2021,23,018978783,"VENDOR 1",XXX11118465,999993348157,"OBJECT,OBJ TYPE,20"BLACK",,1546.0,EA
解决方案
我会解析它,而不是不回复 reg exp。基本思想是将字符串拆分为一个字符数组并循环遍历它并找出在哪里拆分它。
const str = '-1821151,03/18/2021,23,018978783,"VENDOR \\"Foo\\" 1",XXX11118465,999993348157,"OBJECT,OBJ TYPE,20"BLACK",,1546.0,EA'
const result = str.split('').reduce((o, c, i, chars) => {
if (c === ',' && !o.isOpen) {
o.arr.push(o.cur);
o.cur = '';
} else if (c === '"' && !o.isSkip) {
o.isOpen = !o.isOpen;
} else if (c === '\\' && !o.isSkip) {
const next = chars[i + 1];
o.isSkip = next === '"' || next === "\\";
} else {
o.cur += c;
o.isSkip = false;
}
if (chars.length === i + 1) {
o.arr.push(o.cur);
}
return o;
}, {
cur: '',
arr: [],
isOpen: false,
isSkip: false
}).arr;
console.log(result);
推荐阅读
- firebase - 连接到无服务器后端的 Kotlin 多平台应用程序,AWS Amplify 和 Firebase 都不能使用
- javascript - ExpressJS MySql 池连接查询返回
- python - Python 中的 Kibana/ElasticSearch API 运行保存的查询,创建查询的 URL
- python - GeoPandas:裁剪 shapefile 后绘制错误
- ansible - 根据值上传 var_files,如果不存在则忽略
- python - Z3检查python字符串可满足性
- debugging - 如何配置 JetBrains Rider 以暂停客户端-服务器 xUnit 测试中的异常
- javascript - 如何使用 nextPage 属性从 JSON 加载更多产品卡
- c++ - 如何漂亮地打印 nlohmann::json json 文件?C++
- python - 如何在 Python 中确定 SQLite3 连接尝试是否成功