换行符匹配正则表达式 - /[\r]/ 是否与 /[]/ 相同?



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

我正在阅读这篇博文: https://davidwalsh.name/remove-multiple-new-lines

它说使用/[rn]/,但我只是想知道这是否总是与/[n]/匹配,或者它们是否是一种维恩图,每个维恩图都可能匹配不同的东西。

不,它们不是一回事。r匹配回车符 (CR(,而n匹配换行符 (LF(。在某些环境中,新行通常由rn指定(如Windows(,而在其他环境中,新行仅由n指定(如Unix(。他们是独立的角色。

下面是一个示例:

const file = 'linernline2';
const file2 = 'linenline2';
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(/[rn]/g, 'nNEW LINE:n')); // two replacements
console.log(file2.replace(/[rn]/g, 'nNEW LINE:n')); // one replacement

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

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

r?n

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

正如评论所指出的,Mac确实只使用r,所以为了匹配它们,你可以提前查看rn,然后匹配:

(?=r|n)r?n?

答案是,通常,这取决于。

一般来说,nr是不一样的。传统上,在正则表达式引擎中

  • n大多数平台(包括Unix,DOS/Windows(映射到ASCIILF字符。在(经典(Mac OS 系统(和旧 OS X 版本(上,映射到 ASCIICR字符。

  • 反过来,r映射到 ASCIICR字符,但在(旧(Mac OS 系统上映射到LF

随着时间的推移,旧的Mac风格往往变得无关紧要。 为了至少部分证明这一点,这里有一个在 Mac OS 9.1 上运行 Safari 10.8 的浏览器镜头,它将r(结果(和r?n、(结果(与单个换行符相匹配 - 只有当正则表达式中存在n时才有匹配。

但是,JavaScript 中仍然存在例外。例如,如果使用模板文本定义多行字符串,则始终会获得换行符 - 无论特定于操作系统的换行定义如何。解释。

尽管如此,如果您在源代码中定义像'rn'这样的字符串文字,或者从包含特定于操作系统的换行符等的文件流中读取文本,则必须处理它。

为了回答您最初的任务,

r?n

通常删除多余的新行是一个安全的选择。

或者,如果真的必须处理旧的Mac风格的使用rn?|n

最新更新