节点正则表达式匹配换行符,但不匹配引号之间的换行符

时间:2016-06-09 17:58:22

标签: javascript regex node.js

我使用NodeJS来传输csv文件,需要处理每一行。我还没有找到一个节点csv解析器模块,它正确支持双引号中的换行符。

因此我使用的是this post模块,需要一个正则表达式来分割,它会在引号中找到换行符而不是

/(\r?\n)/之类的内容会找到换行符,但如何在双引号字符串中省略换行符?

示例输入(注意第二行中的换行符):

1,2,3,"foo bar baz",4,5
2,2,3,"foo bar 
baz",4,5
3,2,3,"foo bar baz",4,5
inputCsvStream.pipe(split(/regex-for-newline-not-in-quotes/)).on('data', (line) => {
  // do something with proper csv line
});

谢谢!

3 个答案:

答案 0 :(得分:1)

您可以使用CSV Parse包代替split,而不是var parse = require('csv-parse'); //... inputCsvStream.pipe(parse).on('data', (line) => { // do something with proper csv line });

split

如果您真的希望坚持inputCsvStream.pipe(split(/(.*?(?:"[^"]*"*.*?)*)\r?\n/)).on('data', (line) => { // ignore the empty lines between the "delimiters" if (!line.length) return; // do something with proper csv line }); 用于此目的,您可以使用在拆分结果中包含的功能,即捕获组中分隔符的一部分:

split

这将采用外括号之间的部分(在正则表达式中)并将其添加到管道结果中。显然getLocation() 管道分隔符之间的部分,在这种情况下,它们总是空字符串。所以这些需要在分裂后明确消除。

答案 1 :(得分:0)

至少fast-csv支持此:

const csv = require('fast-csv');

csv.fromString(`\
1,2,3,"foo bar baz",4,5
2,2,3,"foo bar 
baz",4,5
3,2,3,"foo bar baz",4,5
`).on('data', (d) => {
  console.log(d);
});

输出:

[ '1', '2', '3', 'foo bar baz', '4', '5' ]
[ '2', '2', '3', 'foo bar \nbaz', '4', '5' ]
[ '3', '2', '3', 'foo bar baz', '4', '5' ]

答案 2 :(得分:-1)

你可以在最后加上一个负面的先行断言:

(\r?\n)(?![^",]*")

Regex demo