【譯】ES2018 新特性: 正規表示式的 s (dotAll) 標誌

mogic發表於2018-08-08

本章將闡述由 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
譯者:杜亨莉

相關文章