在编写 JavaScript 正则表达式时,只放置 "n" 而不是"[rn]"是否安全?



更新:我最初的测试涉及从文本文件复制/粘贴到浏览器,这是有缺陷的。我在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似乎确实区分了rn,但并非在所有情况下。以下是例外情况:

  1. 如果使用String.fromCharCode(13)在JavaScript中生成回车字符串,并尝试将其与模式r匹配,则该模式将成功匹配
  2. 如果您用键盘直接在浏览器中的<textarea>中键入换行符,JavaScript会将其解释为nr将没有匹配项
  3. 如果将包含回车(r(的文本从文本文件复制/粘贴到浏览器中的<textarea>中,则浏览器将把rn的所有序列转换为仅n。因此,JavaScript似乎忽略了文本中的r,但这只是因为浏览器在将其粘贴到<textarea>的过程中删除了它们

我用运行的测试更新了我的原始问题,以确认r令牌与String.fromCharCode(13)生成时匹配。

最新更新