【译】ES2018 新特性: 正则表达式的 s (dotAll) 标志

本章将阐述由 Mathias Bynens 提出的提案——用于正则表达式的 “s (dotAll)“ 标志。

概述

目前,正则表达式中的点(.)无法匹配换行符:

> /^.$/.test('\n')
false
复制代码

本提案指定的正则表达式标志 /s 可以改变现状:

> /^.$/s.test('\n')
true
复制代码

正则表达式中的点(.)的限制

正则表达式中的点(.)有两个限制。

首先,它不能匹配星体(非 BMP)字符,例如 emoji:

> /^.$/.test('?')
false
复制代码

这个可以利用 /u 标志来解决:

> /^.$/u.test('?')
true
复制代码

第二,它不能匹配换行符:

> /^.$/.test('\n')
false
复制代码

这个目前只能通过用其他标志替换 . 来解决,例如 [^] (”非空字符“)或者 [\s\S] (”空格或非空格“)。

> /^[^]$/.test('\n')
true
> /^[\s\S]$/.test('\n')
true
复制代码
ECMAScript 中可被识别的换行符

ECMAScript 的 换行符 产生的影响:

  • 点(.),在所有正则表达式中都没有 /s 这个标志。
  • ^$ ,当标志 /m (multiline) 被使用的时候。

在 ECMAScript 中被认为是换行符的字符有:

  • U+000A 换行(LF)(\n)
  • U+000D 回车(CR)(\r)
  • U+2028 行分隔符
  • U+2029 段落分隔符

此外,还有一些类似于换行的字符在 ECMAScript 中不被认为是换行符:

  • U+000B 垂直制表符 (\v)
  • U+000C 换页符 (\f)
  • U+0085 下一行

这三个字符不需要其他标志就可以被 . 匹配:

> /^...$/.test('\v\f\u{0085}')
true
复制代码

提案

该提案引进正则表达式标志 /s (“singleline”的缩写),使得 . 可以匹配换行符:

> /^.$/s.test('\n')
true
复制代码

/s 的全名是 dotAll ,该属性表示是否使用了 s 标志:

> /./s.dotAll
true
> /./s.flags
's'
> new RegExp('.', 's').dotAll
true
> /./.dotAll
false
复制代码
dotAll vs. multiline
  • dotAll 只影响 .
  • multiline 只影响 ^$

常见问题

为什么这个标志被命名为 /s

既然 dotAll 可以很好的描述标志的作用,那么为什么不用 /a 或者 /d 命名呢?因为 /s 这个名称在其他语言的正则表达式中已被广泛应用(包括 Perl、Python、Java、c#、…)。

评论


原文:http://exploringjs.com/es2018-es2019/ch_regexp-dotall-flag.html
译者:杜亨莉

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值