【译】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
 譯者:杜亨莉
總結
以上是生活随笔為你收集整理的【译】ES2018 新特性: 正则表达式的 s (dotAll) 标志的全部內容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: Unity3D——C#编译到运行的过程分
- 下一篇: 10张图带你深入理解Docker容器和镜
