“正则表达式的 s
(dotAll) flag” 提案 proposal-regexp-dotall-flag 由 Mathias Bynens 负责,目前已经进入 stage 4,并将成为 ES9(ES2018) 的一部分。html
在 JavaScript 正则表达式中 .
用来匹配任何单个字符。可是有 2 个例外:java
let regex = /^.$/; regex.test('?'); // false
咱们能够经过设置 u
标志来解决,u
的含义是 unicode:git
let regex = /^.$/u; regex.test('?'); // true
行终结符包含:github
\n
) - 换行\r
) - 回车还有一些其它字符,也能够做为一行的开始:web
\v
)\f
)目前 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
在正则表达式中,用于表示字符串开头和字符串结尾的元字符是 ^
和 $
, 所以一个变通的方式是使用 ^
来匹配。api
/foo.bar/.test('foo\nbar'); // false /foo[^]bar/.test('foo\nbar'); // true
或者使用 \s
来匹配空白字符:babel
/foo.bar/.test('foo\nbar'); // false /foo[\s]bar/.test('foo\nbar'); // true
在最新的 ECMAScript 规范中,为 JavaScript 的正则表达式增长了一个新的标志 s
用来表示 dotAll。以使 .
能够匹配任意字符。app
/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"
既然是为了实现 dotAll 功能,为何不命名为 d
或者 a
。由于在其它语言的正则表达式实现中,已经使用 s
标志了:
Pattern.DOTALL
RegexOptions.Singleline
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 正则表示中全部修饰符的含义:
regexpu (transpiler) with the { dotAllFlag: true }
option enabled