0

我不是正则表达式大师,但我正在寻找一个可以在 js 中给出这个结果的正则表达式:

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

结果是

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

编辑:

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

标签1,标签2

但是也

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

EDIT2:感谢您以惊人的速度回答 minitech,这成功了!

4

3 回答 3

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;
}

注意: requires String#trim,您可以按如下方式对其进行 shiv:

if(!String.prototype.trim) {
    String.prototype.trim = function() {
        return this.replace(/^\s+/, '').replace(/\s+$/, '');
    };
}
于 2012-09-01T20:57:49.513 回答
1

正则表达式可能不是完成此任务的最佳工具。您可能希望通过遍历字符并决定要做什么来代替。这是一些可以做到这一点的伪代码:

  • 循环遍历字符:
    • 是报价单吗?
      • 切换报价标志。
    • 未设置引用标志时是否为逗号?
      • 将累积的字符串添加到数组中。
      • 清除累积的字符串。
      • 跳过此迭代中的剩余步骤。
    • 将当前字符添加到正在累积的字符串中。
  • 累积的字符串不为空吗?
    • 将累积的字符串添加到数组中。
  • (可选)从数组中的所有字符串中去除空格。
    这也可以在将字符串添加到数组时完成。
于 2012-09-01T20:57:15.373 回答
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);
  }
}

在此处测试此代码。

于 2012-09-01T21:20:50.270 回答