我不是正则表达式大师,但我正在寻找一个能在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,这就是诀窍!
答案 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。