正则表达式中,点(.)是一个特殊字符,代表任意的单个字符,但是行终止符(line terminator character)除外。
以下四个字符属于“行终止符”
U+000A 换行符(\n)
U+000D 回车符(\r)
U+2028 行分隔符(line separator)
U+2029 段分隔符(paragraph separator)
/foo.bar/.test('foo\nbar')
// false
上面代码中,因为 . 不匹配 \n ,所以正则表达式返回 false。
很多时候我们想要匹配任意单个字符,这里有一种变通的写法。
/foo[^]bar/.test('foo\nbar')
// true
上面方案由于不太符合直觉,所以现在引入 /s 修饰符,使得 . 可以匹配任意单个字符。
/foo.bar/s.test('foo\nbar') // true
上面代码被称为 dotAll 模式,即点(dot)代表一切字符,所以正则表达式还引入了一个 dotAll 属性,返回一个布尔值,表示该正则表达式是否处在 dotAll 模式。
const re = /foo.bar/s;
// 另一种写法
// const re = new RegExp('foo.bar', 's');
re.test('foo\nbar') // true
re.dotAll // true
re.flags // 's'
/s 修饰符和多行修饰符 /m 不冲突,两者一起使用的情况下, . 匹配所以字符,而 ^ 和 $ 匹配每一行的行首和行尾。