就匹配字符串中的换行符而言 -/[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
,所以为了匹配它们,你可以提前查看r
或n
,然后匹配:
(?=r|n)r?n?
答案是,通常,这取决于。
一般来说,n
和r
是不一样的。传统上,在正则表达式引擎中
-
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