换行符正则表达式-/ [\ r \ n] /与/ [\ n] /相同?

时间:2018-09-06 03:06:57

标签: javascript node.js regex ecmascript-6

就匹配字符串中的换行符而言-/[\r\n]//[\n]/相同吗?

我正在阅读此博客文章: https://davidwalsh.name/remove-multiple-new-lines

它说要使用/[\r\n]/,但是我只是想知道它是否始终与/[\n]/匹配,或者它们是否是维恩图,每个都可能匹配不同的东西。

2 个答案:

答案 0 :(得分:3)

不,他们不是同一回事。 \r匹配回车(CR),而\n匹配换行(LF)。在某些环境中,换行通常由\r\n指定(例如Windows),而在其他环境中,换行仅由\n指定(例如Unix)。它们是单独的字符。

这是一个例子:

const file = 'line\r\nline2';
const file2 = 'line\nline2';

console.log(file.replace(/[\n]/g, '\nNEW LINE:\n')); // one replacement
console.log(file2.replace(/[\n]/g, '\nNEW LINE:\n')); // one replacement

console.log(file.replace(/[\r\n]/g, '\nNEW LINE:\n')); // two replacements
console.log(file2.replace(/[\r\n]/g, '\nNEW LINE:\n')); // one replacement

如您所见,您不能仅使用[\n]而不是[\r\n]-输出是不同的,它们将匹配字符串的不同部分。

通常,当您要以未知格式匹配通用换行时,可以使用

\r?\n

匹配回车符(如果存在的话),后跟换行符。

正如评论所言,确实是 old Mac仅使用\r,因此,为了匹配它们,您可以提前使用\r\n,然后匹配:

(?=\r|\n)\r?\n?

答案 1 :(得分:1)

答案通常取决于情况。

通常,\n\r 不相同。传统上,在正则表达式引擎中

  • \n在大多数平台(包括Unix,DOS / Windows)上映射为ASCII LF字符。在(经典)Mac OS系统(和旧的OS X版本)上,映射到ASCII CR字符。

  • \r依次映射到ASCII CR字符,但是在(旧)Mac OS系统上映射到LF

随着时间的流逝,旧的Mac风格往往变得无关紧要。 为了至少部分证明这一点,以下是在Mac OS 10.8上运行Safari 9.1的浏览器快照,该快照将\rresult)和\r?\n,(result)与单行换行符-仅当正则表达式中存在\n时才匹配。

但是,JavaScript中仍然有例外。例如,如果您使用template literal定义多行字符串,则始终获得换行符-不管操作系统特定的换行符如何。 Explanation

尽管如此,如果您在源代码中定义了字符串文字,例如'\r\n',或者从包含特定于操作系统的换行符的文件流中读取文本,等等,则必须对其进行处理。

要回答您的最初任务,

\r?\n

通常可以删除多余的新行。

或者,如果确实需要处理旧的Mac风格,请使用\r\n?|\n