【问题标题】:javascript split string by comma ignore inside quotes [duplicate]javascript用逗号分割字符串忽略引号内[重复]
【发布时间】:2012-10-30 06:18:15
【问题描述】:

可能重复:
Javascript code to parse CSV data

我有这个字符串:

"display, Name" <test@test.com>, display" Name <test@test.com>, test@test.com

我想把这个字符串分成一个数组

array[0] = "\"display, Name\" <test@test.com>"
array[1] = "display\" Name <test@test.com>"
array[2] = "test@test.com"

这是我的代码:

var comma = inQuotes = false;
for(var i=0;i<str.length;i++) {
            if (str[i] == '"') inQuotes = !inQuotes;
            comma = (str[i] == "," && !inQuotes)  ? true : false;
            item += (!comma) ? str[i] : "";
            if(comma || i == str.length-1) {  
                items.push(item);
                item = "";
            }    
        } 

我的问题是,如果字符串中有一个双引号而没有更近的字符串

感谢您的帮助...

【问题讨论】:

  • 如果没有某种形式的一致性,这将很难。如果这些遵循电子邮件地址协议(email@address.comname &lt;email@address.com"name" &lt;email@address.com&gt;),这将容易得多。是否保证像您提供的那样格式不正确?我的流浪报价(打开而不关闭或关闭而不打开)将使这变得非常复杂。
  • @JasonMcCreary:这不是 CSV,而是格式错误的RFC2822 电子邮件地址列表。
  • 我明白了。尽管如此,该解决方案仍可扩展。

标签: javascript regex


【解决方案1】:

我试过这个,它适用于上面的字符串jsfiddle

var a = '"display, Name" <test@test.com>, display" Name <test@test.com>, test@test.com';
var aa = a.match(/"(.*?)"(.*?),|(.*?),|(.*?)$/g); 
aa.pop();
aa // [""display, Name" <test@test.com>,", " display" Name <test@test.com>,", " test@test.com"]

【讨论】:

  • +1 表示好的出价。我的另一个选择是寻找类似于email@address.com&gt; 的东西,但javascript 不做后视。我想在这种情况下,不贪婪的匹配同样好。
  • 谢谢,但它不是防弹测试它:"display, Name" , display" Name , "display, name"
  • @Erana111 任何程序化解决方案应该如何知道,引号 4 和 5 属于一起,而不是 3 和 4(其中 5 不匹配)
猜你喜欢
  • 1970-01-01
  • 2012-05-23
  • 2012-07-12
  • 2020-04-05
  • 2012-10-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-04-07
相关资源
最近更新 更多