Javascript 按换行符拆分字符串,保留带引号的段
我有一个csv文件,它被读入一个字符串,我需要用换行符分隔该字符串,并保留带引号的段。使用引号的原因是文件的某些字段中有换行符 基本上,我有一个这样的文件(我用|表示分隔符): 这是一条线 这也是一条线,但这个字段有 断线“ 这是另一条线 我知道我可以使用带有Javascript 按换行符拆分字符串,保留带引号的段,javascript,regex,split,Javascript,Regex,Split,我有一个csv文件,它被读入一个字符串,我需要用换行符分隔该字符串,并保留带引号的段。使用引号的原因是文件的某些字段中有换行符 基本上,我有一个这样的文件(我用|表示分隔符): 这是一条线 这也是一条线,但这个字段有 断线“ 这是另一条线 我知道我可以使用带有.split()函数的正则表达式,但我遇到了问题。有人能帮忙吗 我期待像这样的数组 [“这是一行”,“这也是一行”\n但此字段有一个换行符”,“这是另一行”]试试这个 ("[^"\n]*)\r?\n(?!(([^"]*"){2})*[^"]
.split()
函数的正则表达式,但我遇到了问题。有人能帮忙吗
我期待像这样的数组
[“这是一行”,“这也是一行”\n但此字段有一个换行符”,“这是另一行”]
试试这个
("[^"\n]*)\r?\n(?!(([^"]*"){2})*[^"]*$)
演示:老实说,这是一个非常简单的问题,即使是正则表达式也似乎有些过分。我只需遍历字符串,每当发现换行符且不在引号内时,将迄今为止找到的子字符串推送到数组中:
var arr=[]
var inQuote=false;
var str=`这是一条|线
这也是一条线,但这个字段有
断线“
这是另一条线`
对于(变量pos=0;pos 控制台。log(ARR)< /代码> ,在另一个答案中,使用循环可能更好,因为即使对分隔符的知识,也很难检查引文是否在数据中间(作为文字)或引用作为引用。
这就是说,该正则表达式应适用于特定情况:
/(?<!\|\s+"[\w\s]+)\n/
/(?
?为负向后看,这意味着不在括号中的零件(\n
)仅在括号中的零件不匹配时才匹配
括号中的部分是分隔符(|
),后跟多个空格\s+
,紧接着是引号“
,然后是单词和空格的混合体
希望这有帮助。\s+
可以修改为\s*
,[\w\s]+
也可以根据需要更改为[^”]*
作为一个最简单的解决方案,我们可以首先标记(替换为某些标识符)我们不希望在拆分的换行符
然后在所有其他换行符处拆分,最后用换行符再次替换保留的换行符标识符
(\n)
arr = str.replace(/("[\s\S]*?")/g, (m, cg) => {
return cg.replace(/\n/g, "LINE-BREAK-TO-PRESERVE");
})
.split('\n')
.filter(i => Boolean(i.trim()))
.map(i => i.replace(/LINE-BREAK-TO-PRESERVE/g, '\n'));
以上代码应能顺利满足您的需求:)为什么第二个示例输出元素有换行符,因为它被引用了?在这种情况下,用占位符替换被引用的换行符,然后按行分割,然后用转义的新行替换所有占位符更简单。某些字段有换行符,当我生成文件时,如果我没有对这些特定字段使用引号,则读取CSV(excel、libreoffice…)的e程序无法识别这一点,请在下面检查我的答案。如果它对您有效,我可以添加解释。不起作用:/I尝试了类似于/(.*.*.\n”)|(.*\n)/g的操作,但它不起作用。它不完全起作用(replace()
适用于第一个带引号的字段,但之后它会替换其后的每一个换行符-我认为问题在于,在我的情况下,不止一个带引号的字段带有换行符)但是你的答案指向了一个好的方向!谢谢:)Heyy@liara。只是有一个小的打字错误。quote matcher必须是非贪婪的。我做了更改。请检查它现在是否有效。
arr = str.replace(/("[\s\S]*?")/g, (m, cg) => {
return cg.replace(/\n/g, "LINE-BREAK-TO-PRESERVE");
})
.split('\n')
.filter(i => Boolean(i.trim()))
.map(i => i.replace(/LINE-BREAK-TO-PRESERVE/g, '\n'));