ES2018 新特征
- 异步迭代器
- 正则表达式反向(lookbehind)断言
- 正则表达式 Unicode 转义
- 非转义序列的模板字符串
- 正则表达式 s/dotAll 形式(本文)
- 正则表达式定名捕捉组
- 对象睁开运算符
- Promise.prototype.finally
“正则表达式的 s
(dotAll) flag” 提案 proposal-regexp-dotall-flag 由 Mathias Bynens 担任,现在已进入 stage 4,并将成为 ES9(ES2018) 的一部分。
1. 概述
在 JavaScript 正则表达式中 .
用来婚配任何单个字符。但是有 2 个破例:
1.1 多字节 emoji 字符
let regex = /^.$/;
regex.test('?'); // false
我们能够经由过程设置 u
标志来处理,u
的寄义是 unicode:
let regex = /^.$/u;
regex.test('?'); // true
1.2 行终结符(line terminator characters)
行终结符包括:
- U+000A LINE FEED (LF) (
\n
) – 换行 - U+000D CARRIAGE RETURN (CR) (
\r
) – 回车 - U+2028 LINE SEPARATOR – 行分隔符
- U+2029 PARAGRAPH SEPARATOR – 段分隔符
另有一些别的字符,也能够作为一行的最先:
- U+000B VERTICAL TAB (
\v
) - U+000C FORM FEED (
\f
) - U+0085 NEXT LINE
现在 JavaScript 正则表达式的 .
能够婚配个中的一部分:
let regex = /./;
regex.test('\n'); // false
regex.test('\r'); // false
regex.test('\u{2028}'); // false
regex.test('\u{2029}'); // false
regex.test('\v'); // true
regex.test('\f'); // true
regex.test('\u{0085}'); // true
在正则表达式中,用于示意字符串开首和字符串末端的元字符是 ^
和 $
, 因而一个变通的体式格局是运用 ^
来婚配。
/foo.bar/.test('foo\nbar'); // false
/foo[^]bar/.test('foo\nbar'); // true
或许运用 \s
来婚配空缺字符:
/foo.bar/.test('foo\nbar'); // false
/foo[\s]bar/.test('foo\nbar'); // true
2. 增添 s/dotAll 标志
在最新的 ECMAScript 范例中,为 JavaScript 的正则表达式增添了一个新的标志 s
用来示意 dotAll。以使 .
能够婚配恣意字符。
/foo.bar/s.test('foo\nbar'); // true
High-level API
const re = /foo.bar/s; // 等价于 const re = new RegExp('foo.bar', 's');
re.test('foo\nbar'); // true
re.dotAll; // true
re.flags; // "s"
3. 定名由来
既然是为了完成 dotAll 功用,为何不定名为 d
或许 a
。由于在别的言语的正则表达式完成中,已运用 s
标志了:
- Java 运用
Pattern.DOTALL
- C# 和 VB 运用
RegexOptions.Singleline
- Python 同时支撑
re.DOTALL
和re.S
在支撑正则表达式运用 flag 的言语如 Perl、PHP 也运用 s
作为标志。
s
的寄义是 singleline 和 dotAll。
singleline(单行)对应的是 multiline(多行)。
m
标志用于指定多行输入字符串应该被视为多个行。假如运用 m
标志,^
和 $
婚配的最先或完毕是字符串中的每一行,而不是全部字符串的最先或完毕。
/^java/.test('just\njava\n'); // false
/^java/m.test('just\njava\n'); // true
-
m
标志只影响^
和$
-
s
标志只影响.
现在在 JavaScript 正则示意中所有修饰符的寄义:
- g → global
- i → ignoreCase
- m → multiline
- y → sticky
- u → unicode
- s → dotAll
4. 完成
- V8 – Chrome 62
- JavaScriptCore – Safari Technology Preview 39a
- XS, shipping in Moddable as of the January 17, 2018 update
regexpu (transpiler) with the
{ dotAllFlag: true }
option enabled