用于逗号分隔字符串的正则表达式

时间:2012-09-01 20:49:47

标签: javascript regex

我不是正则表达式大师,但我正在寻找一个能在js中得到这个结果的正则表达式:

var regex = ...;
var result = '"a b", "c, d", e f, g, "h"'.match(regex);

,结果将是

['"a b"', '"c, d"', 'e f', 'g', '"h"']

编辑:

不需要处理转义引号。它用于标记字段,用户必须能够输入:

tag1,tag2

但也

“纽约,美国”,“波士顿,美国”

EDIT2: 感谢你快速回答minitech,这就是诀窍!

3 个答案:

答案 0 :(得分:3)

我只是使用一个循环:

function splitCSVFields(row) {
    var result = [];
    var i, c, q = false;
    var current = '';

    for(i = 0; c = row.charAt(i); i++) {
        if(c === '"') {
            current += c;
            q = !q;
        } else if(c === ',' && !q) {
            result.push(current.trim());
            current = '';
        } else {
            current += c;
        }
    }

    if(row.length > 0) {
        result.push(current.trim());
    }

    return result;
}

注意:需要String#trim,您可以按照以下方式进行操作:

if(!String.prototype.trim) {
    String.prototype.trim = function() {
        return this.replace(/^\s+/, '').replace(/\s+$/, '');
    };
}

答案 1 :(得分:1)

正则表达式可能不是此任务的最佳工具。您可能希望通过循环遍历字符并决定要执行的操作来代替。这是一些伪代码:

  • 遍历字符:
    • 是报价吗?
      • 切换报价标记。
    • 引号标志未设置时是逗号吗?
      • 将累积的字符串添加到数组中。
      • 清除累积的字符串。
      • 跳过此迭代中的其余步骤。
    • 将当前字符添加到正在累积的字符串中。
  • 累积的字符串不是空的吗?
    • 将累积的字符串添加到数组中。
  • (可选)从数组中的所有字符串中删除空白 将字符串添加到数组中时也可以这样做。

答案 2 :(得分:0)

var result = input.match(/(?:(?:"((?:[^"]|"")*)")|([^",\n]*))/g);
for (var i = 0; i < result.length; i++) {
  result[i] = result[i].replace(/^\s*/, "").replace(/\s*$/, "");
  if (result[i].length === 0) {
    result.splice(i--, 1);
  }
}

测试此代码here