使用正则表达式构建分隔符解析器时出现第一个空白值的问题

时间:2016-12-10 06:07:23

标签: javascript regex

我正在构建这个通用解析器,它使用指定的分隔符将字符串解码为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"]

有什么想法吗?

3 个答案:

答案 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更容易。