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