我正在构建这个通用解析器,它使用指定的分隔符将字符串解码为Array。
这是我目前的正则表达式:
var reg = /(\,|\r?\n|\r|^)(?:\"([^\"]*(?:\"\"[^\"]*)*)\"|([^"\,\r\n]*))/gi
适用于大多数情况,例如:
'a,b,c,d'.match(reg);
返回
["a", ",b", ",c", ",d"]
(用逗号表示值不是问题)
当我有空值时,它也有效,例如:
'a,,c,'.match(reg);
返回["a", ",", ",c", ","]
(这也没关系)
问题是当我在第一个位置有一个空白值时:
',b,c,d'.match(reg);
返回[",b", ",c", ",d"]
,我期待的是:["", ",b", ",c", ",d"]
有什么想法吗?
答案 0 :(得分:2)
如果您希望按,
拆分,则正则表达式非常简单:/,/g
。
然后,您可以将此模式传递到split
函数。
它也适用于多字符分隔符,例如foo
。
然后你可以这样做:
var pattern = /,/g;
var el = document.getElementById('out');
el.insertAdjacentHTML('beforeend', '<p>Trying with ,</p>');
output('a,b,c,d');
output(',b,c,d');
output(',,,d');
output('a,,c,');
el.insertAdjacentHTML('beforeend', '<p>Trying with foo</p>');
var pattern = /foo/g;
output('afoobfoocfood');
output('foobfoocfood');
output('foofoofood');
output('afoofoocfoo');
function output(input) {
var item = '<p>' + input + ' gives: ';
var arr = input.split(pattern);
item += '<pre>' + JSON.stringify(arr) + '</pre></p>';
el.insertAdjacentHTML('beforeend', item);
}
<div id="out"></div>
答案 1 :(得分:1)
像这个正则表达式更简单的事情:
[^\,]*\,(?!$)|[^\,]|\,
上面的正则表达式将捕获包含特殊字符的,
之间的任何内容。您可以在它上面构建它以匹配特定类型的字符。
这是一个有效的js:
var reg = /[^\,]*\,(?!$)|[^\,]|\,/gi;
var s = ',,b,c,d'.match(reg);
document.write(s[0], '<br>' , s[1] , '<br>' , s[2] , '<br>' , s[3], '<br>' , s[4]);
答案 2 :(得分:1)
感谢所有发布答案的人,但我最终选择了这里提供的解决方案:
Javascript code to parse CSV data
上面的解决方案也存在第一个位置的空值问题,但在while循环中用JS解决这个问题比修复RegEx更容易。