Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 按换行符拆分字符串,保留带引号的段_Javascript_Regex_Split - Fatal编程技术网

Javascript 按换行符拆分字符串,保留带引号的段

Javascript 按换行符拆分字符串,保留带引号的段,javascript,regex,split,Javascript,Regex,Split,我有一个csv文件,它被读入一个字符串,我需要用换行符分隔该字符串,并保留带引号的段。使用引号的原因是文件的某些字段中有换行符 基本上,我有一个这样的文件(我用|表示分隔符): 这是一条线 这也是一条线,但这个字段有 断线“ 这是另一条线 我知道我可以使用带有.split()函数的正则表达式,但我遇到了问题。有人能帮忙吗 我期待像这样的数组 [“这是一行”,“这也是一行”\n但此字段有一个换行符”,“这是另一行”]试试这个 ("[^"\n]*)\r?\n(?!(([^"]*"){2})*[^"]

我有一个csv文件,它被读入一个字符串,我需要用换行符分隔该字符串,并保留带引号的段。使用引号的原因是文件的某些字段中有换行符

基本上,我有一个这样的文件(我用|表示分隔符):

这是一条线

这也是一条线,但这个字段有

断线“

这是另一条线

我知道我可以使用带有
.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'));