用逗号分割一个字符串,但使用 Javascript 忽略双引号内的逗号

IT技术 javascript regex
2021-01-12 22:42:31

我正在寻找[a, b, c, "d, e, f", g, h]变成 6 个元素的数组:a、b、c、“d、e、f”、g、h。我正在尝试通过 Javascript 来做到这一点。这是我到目前为止:

str = str.split(/,+|"[^"]+"/g); 

但是现在它正在拆分双引号中的所有内容,这是不正确的。

编辑:好的,对不起,我对这个问题的措辞非常糟糕。我得到的是一个字符串而不是一个数组。

var str = 'a, b, c, "d, e, f", g, h';

我想使用类似“split”函数的东西变成一个数组。

6个回答

这就是我要做的。

var str = 'a, b, c, "d, e, f", g, h';
var arr = str.match(/(".*?"|[^",\s]+)(?=\s*,|\s*$)/g);

在此处输入图片说明 /* 将匹配:

    (
        ".*?"       double quotes + anything but double quotes + double quotes
        |           OR
        [^",\s]+    1 or more characters excl. double quotes, comma or spaces of any kind
    )
    (?=             FOLLOWED BY
        \s*,        0 or more empty spaces and a comma
        |           OR
        \s*$        0 or more empty spaces and nothing else (end of string)
    )
    
*/
arr = arr || [];
// this will prevent JS from throwing an error in
// the below loop when there are no matches
for (var i = 0; i < arr.length; i++) console.log('arr['+i+'] =',arr[i]);
很好,但单词之间的空格分开,我将其修改为 /(".*?"|[^\s",][^",]+[^\s",])(?=\s*,|\s*$)/
2021-03-15 22:42:31
第一列没有数据时不起作用(从 excel 导出) ,col2_val,col3_val
2021-03-18 22:42:31
很棒的正则表达式伙伴。但还/".*"|[^,"\s]+/不够吗?
2021-03-27 22:42:31
要使其与中间的空格一起使用(".*?"|[^",]+)(?=\s*,|\s*$),请使用更新的形式 : ,请参阅
2021-03-28 22:42:31
这不适用于这样的字符串:'Hello World, b, c, "d, e, f", c'它返回["World","b","c","d, e, f", "c"]
2021-04-04 22:42:31

正则表达式: /,(?=(?:(?:[^"]*"){2})*[^"]*$)/

在此处输入图片说明

const input_line = '"2C95699FFC68","201 S BOULEVARDRICHMOND, VA 23220","8299600062754882","2018-09-23"'

let my_split = input_line.split(/,(?=(?:(?:[^"]*"){2})*[^"]*$)/)[4]

Output: 
my_split[0]: "2C95699FFC68", 
my_split[1]: "201 S BOULEVARDRICHMOND, VA 23220", 
my_split[2]: "8299600062754882", 
my_split[3]: "2018-09-23"

参考以下链接进行解释:regexr.com/44u6o

这对我来说非常有效,但是如何更改以在结果中不包含外部引号?
2021-03-15 22:42:31

这是一个 JavaScript 函数来做到这一点:

function splitCSVButIgnoreCommasInDoublequotes(str) {  
    //split the str first  
    //then merge the elments between two double quotes  
    var delimiter = ',';  
    var quotes = '"';  
    var elements = str.split(delimiter);  
    var newElements = [];  
    for (var i = 0; i < elements.length; ++i) {  
        if (elements[i].indexOf(quotes) >= 0) {//the left double quotes is found  
            var indexOfRightQuotes = -1;  
            var tmp = elements[i];  
            //find the right double quotes  
            for (var j = i + 1; j < elements.length; ++j) {  
                if (elements[j].indexOf(quotes) >= 0) {  
                    indexOfRightQuotes = j; 
                    break;
                }  
            }  
            //found the right double quotes  
            //merge all the elements between double quotes  
            if (-1 != indexOfRightQuotes) {   
                for (var j = i + 1; j <= indexOfRightQuotes; ++j) {  
                    tmp = tmp + delimiter + elements[j];  
                }  
                newElements.push(tmp);  
                i = indexOfRightQuotes;  
            }  
            else { //right double quotes is not found  
                newElements.push(elements[i]);  
            }  
        }  
        else {//no left double quotes is found  
            newElements.push(elements[i]);  
        }  
    }  

    return newElements;  
}  

这对我很有效。(我使用了分号,因此警报消息将显示将数组转换为字符串时添加的逗号与实际捕获的值之间的差异。)

正则表达式

/("[^"]*")|[^;]+/

在此处输入图片说明

var str = 'a; b; c; "d; e; f"; g; h; "i"';
var array = str.match(/("[^"]*")|[^;]+/g); 
alert(array);
@DFM:这取决于“正确”的含义。此外,原始问题暗示没有“;;” 场景。
2021-03-27 22:42:31
这个没有正确解析空字段,如 a;b;;c
2021-04-06 22:42:31

这是一个假设双引号成对出现的非正则表达式:

function splitCsv(str) {
  return str.split(',').reduce((accum,curr)=>{
    if(accum.isConcatting) {
      accum.soFar[accum.soFar.length-1] += ','+curr
    } else {
      accum.soFar.push(curr)
    }
    if(curr.split('"').length % 2 == 0) {
      accum.isConcatting= !accum.isConcatting
    }
    return accum;
  },{soFar:[],isConcatting:false}).soFar
}

console.log(splitCsv('asdf,"a,d",fdsa'),' should be ',['asdf','"a,d"','fdsa'])
console.log(splitCsv(',asdf,,fds,'),' should be ',['','asdf','','fds',''])
console.log(splitCsv('asdf,"a,,,d",fdsa'),' should be ',['asdf','"a,,,d"','fdsa'])