【问题标题】:Splitting a CSV string but not certain elements javascript拆分CSV字符串但不是某些元素javascript
【发布时间】:2022-08-18 14:48:27
【问题描述】:

如果给定一个逗号分隔的字符串,如下

\'UserName,Email,[a,b,c]\'

我想要一个所有最外层元素的拆分数组,所以预期结果

[\'UserName\',\'Email\', \'[a,b,c]\']

string.split(\',\') 将在每个逗号之间拆分,但这不起作用所以有什么建议吗?这打破了我拥有的 CSV 阅读器。

标签: javascript string csv split


【解决方案1】:

我写了 2 个类似的答案,所以不妨把它排在第三位,而不是把你介绍给那里。这是一个有状态的分裂。这不支持嵌套数组,但可以轻松实现。

var str = 'UserName,Email,[a,b,c]'

function tokenize(str) {
  var state = "normal";
  var tokens = [];
  var current = "";
  for (var i = 0; i < str.length; i++) {
    c = str[i];

    if (state == "normal") {
      if (c == ',') {
        if (current) {
          tokens.push(current);
          current = "";
        }
        continue;
      }
      if (c == '[') {
        state = "quotes";
        current = "";
        continue;
      }
      current += c;
    }
    if (state == "quotes") {
      if (c == ']') {
        state = "normal";
        tokens.push(current);
        current = "";
        continue;
      }
      current += c;
    }
  }
  if (current) {
    tokens.push(current);
    current = "";
  }
  return tokens;
}


console.log(tokenize(str))

【讨论】:

    【解决方案2】:

    您可以通过将数组与此正则表达式匹配来做到这一点:

     /(^|(?<=,))\[[^[]+\]|[^,]+((?=,)|$)/
    

    let string = '[a,b,c],UserName,[1,2],Email,[a,b,c],password'
    let regex = /(^|(?<=,))\[[^[]+\]|[^,]+((?=,)|$)/g
    let output = string.match(regex);
    console.log(output)
    正则表达式可以总结为:

    匹配用逗号括起来的数组或字符串或输入的开头/结尾

    我们使用的密钥令牌是选择| 作为一种要么这个,要么那个并且由于regex engine is eager,当它匹配一个时,它会继续前进。所以如果我们匹配和排列,那么我们继续前进,不考虑里面有什么。

    我们可以将其分解为 3 个主要部分:

    • (^|(?&lt;=,))

      • ^ 从我们字符串的开头匹配
      • | 或者
      • (?&lt;=,) 匹配前面有逗号的字符串而不返回逗号。阅读更多关于积极的环视here
    • \[[^[]+\] | [^,]+

      • \[[^[]+\] 匹配以[ 开头并以] 结尾并且可以包含一个或多个字符的字符串不是[
        • 这是因为在[1,2],[a,b] 中它可以一次匹配整个字符串,因为它以[ 开头并以] 结尾。这样,我们的条件通过删除还包含 [ 的匹配项来阻止这种情况,表明它属于第二个数组。
      • | 或者
      • [^,]+ 匹配不包含逗号的任意长度的字符串,原因与上面的括号相同,因为从技术上讲,,asd,qwe, 的所有 asd,qwe 都用逗号括起来。
    • ((?=,)|$)

      • (?=,) 匹配任何后跟逗号的字符串
      • | 或者
      • $ 匹配以主字符串结尾的字符串。阅读here 以获得更好的解释。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-26
      • 2010-10-31
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多