s
(dotAll
) flag for regular expressionsThe proposal “s
(dotAll
) flag for regular expressions” by Mathias Bynens is at stage 4. This blog post explains how it works.
Currently, the dot (.
) in regular expressions doesn’t match line terminator characters:
> /^[^]$/.test('\n')
true
The proposal specifies the regular expression flag /s
that changes that:
> /^.$/s.test('\n')
true
.
) in regular expressions The dot (.
) in regular expressions has two limitations.
First, it doesn’t match astral (non-BMP) characters such as emoji:
> /^.$/.test('😀')
false
This can be fixed via the /u
(unicode
) flag:
> /^.$/u.test('😀')
true
Second, the dot does not match line terminator characters:
> /^.$/.test('\n')
false
That can currently only be fixed by replacing the dot with work-arounds such as [^]
(“all characters except no character”) or [\s\S]
(“either whitespace nor not whitespace”).
> /^[^]$/.test('\n')
true
> /^[\s\S]$/.test('\n')
true
Line termators in ECMAScript affect:
/s
.^
and $
if the flag /m
(multiline
) is used.The following for characters are considered line terminators by ECMAScript:
\n
)\r
)There are additionally some newline-ish characters that are not considered line terminators by ECMAScript:
\v
)\f
)Those three characters are matched by the dot without a flag:
> /^...$/.test('\v\f\u{0085}')
true
The proposal introduces the regular expression flag /s
(short for “singleline”), which leads to the dot matching line terminators:
> /^.$/s.test('\n')
true
The long name of /s
is dotAll
:
> /./s.dotAll
true
> /./s.flags
's'
> new RegExp('.', 's').dotAll
true
> /./.dotAll
false
dotAll
vs. multiline
dotAll
only affects the dot.multiline
only affects ^
and $
./s
? dotAll
is a good description of what the flag does, so, arguably, /a
or /d
would have been better names. However, /s
is already an established name (Perl, Python, Java, C#, ...).