在JavaScript中确定文本中使用的换行符类型的最有效(快速且可靠)的方法是什么 - Unix vs Windows。
在我的Node应用程序中,我必须读取大的utf-8文本文件,然后根据它们是使用Unix还是Windows换行符来处理它们。
当换行符的类型出现不确定时,我想根据最有可能的那一行得出结论。
更新
根据我自己的答案,code I ended up using。
答案 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-newline 和crlf-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。