首页 > 解决方案 > 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

标签: javascriptregexcsv

解决方案


我会解析它,而不是不回复 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);


推荐阅读