如何从字符串中删除尾部换行符?

3

在将CSV导入并将行分割成数组之前,我需要从末尾删除一些冗余的'\n'(否则会得到额外的空行)。

public function parseCSV(data:String):Array {

    //something to strip linebreaks, \n and \r from end of array

    var lines : Array = data.split ( /\R/ );
    var preamble : Array = lines.splice(0,trashLength);
    var keyArray : Array = lines.splice ( 0, 1 )[0].split ( "," );
    var assocArray : Array = [];
    for each (var line:String in lines)
    {
        var valArray : Array = line.split ( "," );
        var assoc : Object = {};
        for (var i : int = 0; i < keyArray.length; i++)
        {
            var key : String = keyArray[i];
            if (key != null && key != "") assoc[key] = valArray[i];
        }
        assocArray.push ( assoc );
    }

    return assocArray;
}
2个回答

6
// normalize line endings to \n, because \r is not recognized as "end of line"
data = data.replace (/\s*\R/g, "\n");  
// remove leading and trailing whitespace
data = data.replace (/^\s*|[\t ]+$/gm, ""); 

我非常确定这个字符串中实际上是 \n(之前我不知道 \R 是什么)。我尝试了你的函数,它从末尾删除了一个多余的行,但还剩下一个(我导入的 CSV 文件末尾有 2 行空行)。 - Damon
它对我有效 - 我的测试代码中有4个空行。你确定你没有计算上由trace添加的最后一个换行符吗? - weltraumpirat
可能是单个尾随换行符。再添加一行代码:data = data.replace (/\R$/, ""); 这应该可以解决问题。 - weltraumpirat
做得好极了!你能否简要解释一下后两个正则表达式,这样我就可以更具体地理解它们在做什么了? - Damon
2
@Damon:好的。第二个正则表达式匹配每行(/m - 如果未设置,则^和$将匹配字符串的开头和结尾)中任何类型的空格(\s,包括换行符和回车符)直接在每行的开头(^)之后或(|)制表符(\t)或空格( )直接在行末($)之前的所有出现,并用空字符串替换它们。第三个正则表达式仅匹配紧挨着字符串结尾的一个换行符。 - weltraumpirat
谢谢你的回答!我正在尝试逐行读取文件并删除愚蠢的行结尾,我只是使用了你这里的第一行代码,并将"\n"替换为""。你太棒了。谢谢。 - Olin Kirkland

0

我发现替换只能在主题字符串中的第一个目标上起作用。您可以尝试使用数组拆分/连接。

public static function removeLineBreaks( s:String ) : String 
{ 
    return s.split("\r").join("\n");
}

如果您不想要分隔符,请将"\n"替换为空白。


你能解释一下这是如何工作的吗?我只想删除字符串末尾的换行符。那不会把所有的\r都替换成\n吗?(在我的字符串中,我已经意识到它们实际上都是\n,我现在正在努力弄清楚\R是什么...) - Damon
啥?匹配结束!如果在正则表达式中使用了/g(全局)选项,Replace函数将会作用于字符串中所有匹配的表达式。 - weltraumpirat

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接