检测换行符的类型

时间:2016-01-15 21:36:56

标签: javascript node.js

在JavaScript中确定文本中使用的换行符类型的最有效(快速且可靠)的方法是什么 - Unix vs Windows。

在我的Node应用程序中,我必须读取大的utf-8文本文件,然后根据它们是使用Unix还是Windows换行符来处理它们。

当换行符的类型出现不确定时,我想根据最有可能的那一行得出结论。

更新

根据我自己的答案,code I ended up using

5 个答案:

答案 0 :(得分:2)

你想先看一下LF。比如source.indexOf('\n'),然后看看它背后的角色是否像source[source.indexOf('\n')-1] === '\r'这样的CR。这样,您只需找到换行符的第一个示例并与之匹配。总之,

function whichLineEnding(source) {
     var temp = source.indexOf('\n');
     if (source[temp - 1] === '\r')
         return 'CRLF'
     return 'LF'
}

在npm模块中有两个流行的库实例: node-newlinecrlf-helper 第一个对整个字符串进行拆分,在您的情况下效率非常低。 第二个使用正则表达式,在你的情况下不够快。

但是,从您的编辑中,如果您想确定哪个更丰富。然后我会使用node-newline中的代码来处理这种情况。

答案 1 :(得分:1)

这是我们使用ESLint规则检测JavaScript文件中的行结尾的方法。 Source表示实际的文件内容。

注意:有时您也可以使用带有混合行尾的文件。

https://github.com/eslint/eslint/blob/master/lib/rules/linebreak-style.js

答案 2 :(得分:1)

感谢@Sam-Graham。我试图产生一种 优化方式 。另外,该函数的输出是直接可用的(请参见下面的示例):

function getLineBreakChar(string) {
    const indexOfLF = string.indexOf('\n', 1);  // No need to check first-character

    if (indexOfLF === -1) {
        if (string.indexOf('\r') !== -1) return '\r';

        return '\n';
    }

    if (string[indexOfLF - 1] === '\r') return '\r\n';

    return '\n';
}

注意1:假设string是健康的(仅包含一种换行符)。

注2:假设您希望LF为默认编码(未找到换行符时)。


用法示例:

fs.writeFileSync(filePath,
        string.substring(0, a) +
        getLineBreakChar(string) +
        string.substring(b)
);

实用程序(可能会有所帮助):

function getLineBreakName(lineBreakChar) {
    return lineBreakChar === '\n' ? 'LF' : lineBreakChar === '\r' ? 'CR' : 'CRLF';
}

答案 3 :(得分:0)

试试这个

if(text.search(/\r/) > -1 || text.search(/\r\n/) > -1){
   alert('Windows');
} else if(text.search(/\n/) > -1){
   alert('Unix');
} else {
   alert('No line breaks found')
}

答案 4 :(得分:0)

最后,我根据简单的统计数据使用了我自己的解决方案:

var os = require('os');

function getEOL(text) {
    const m = text.match(/\r\n|\n/g);
    const u = m && m.filter(a => a === '\n').length;
    const w = m && m.length - u;
    if (u === w) {
        return os.EOL; // use the OS default
    }
    return u > w ? '\n' : '\r\n';
}

如果没有换行符,或者它们的数字突然相等,它将返回操作系统的默认EOL。