更新:我最初的测试涉及从文本文件复制/粘贴到浏览器,这是有缺陷的。我在JavaScript中创建了一个新的测试,它验证了回车符\r实际上是匹配的
以下代码将['r', 'r', 'r']
记录到控制台,控制台验证r
是否匹配:
<script>
const CarriageReturn = String.fromCharCode(13); // char code for carriage return is 13
const str = CarriageReturn + CarriageReturn + CarriageReturn;
const matches = str.match(/r/g);
console.log(matches); // this will output ['r', 'r', 'r']
</script>
原始问题
互联网上的许多StackOverflow答案和文章建议,在正则表达式中匹配换行符的常用方法是使用无处不在的令牌[rn]
。它被认为是为了确保与Windows系统的兼容性,因为Windows将回车r
和换行n
一起使用来创建新行,而不是仅使用换行n
来创建基于UNIX的操作系统(如Linux或Mac(。
我开始认为JavaScript忽略了这一区别,只是将每一个换行符都视为n
。
今天,我做了一个实验,创建了一个包含10个回车的文本文件,打开文本文件,然后将回车复制/粘贴到位于https://regex101.com.
当我针对简单正则表达式r
测试所有这些回车时,没有匹配的东西。但是,使用替代n
匹配所有10个回车。
所以我的问题是,根据我的实验,在JavaScript中匹配换行时,只写n
而不是[rn]
安全吗?
否,不要将[rn]
替换为n
。
行结束于http://regex101.com只有n
,这就是为什么你没有r
的对手。
在实际文本中,回车符和换行符可能都需要匹配。
此外,该点与JavaScript正则表达式中的r
不匹配。
JavaScript将换行符视为n
,这就是为什么在测试时它与所有换行符都匹配。rn
是表示换行符的窗口样式,而基于Unix的系统使用n
。如果您不确定,可以使用以下正则表达式:/r?n/
在进行不同的测试后,JavaScript似乎确实区分了r
和n
,但并非在所有情况下。以下是例外情况:
- 如果使用
String.fromCharCode(13)
在JavaScript中生成回车字符串,并尝试将其与模式r
匹配,则该模式将成功匹配 - 如果您用键盘直接在浏览器中的
<textarea>
中键入换行符,JavaScript会将其解释为n
。r
将没有匹配项 - 如果将包含回车(
r
(的文本从文本文件复制/粘贴到浏览器中的<textarea>
中,则浏览器将把rn
的所有序列转换为仅n
。因此,JavaScript似乎忽略了文本中的r
,但这只是因为浏览器在将其粘贴到<textarea>
的过程中删除了它们
我用运行的测试更新了我的原始问题,以确认r
令牌与String.fromCharCode(13)
生成时匹配。