1. 背景
正则表达式是用于匹配字符串中字符组合的模式。
它使用一个模式字符串,来描述一系列匹配该句法规则的字符串集合。
在JavaScript中,正则表达式也是对象。
这些模式被用于RegExp
的exec
和test
方法,
以及String
的match
、replace
、search
和split
方法。
正则表达式对象,有一个flags
属性,
可用于表示字符串匹配的搜索方式,例如,进行全局或不区分大小写进行搜索。
这些参数既可以单独使用也可以一起使用。
2. 语法
/pattern/flags
new RegExp(pattern[, flags])
RegExp(pattern[, flags])
其中,pattern
为模式字符串,
flags
表示匹配方式。
3. flags
3.1 g
全局匹配,
找到所有匹配,而不是只找到第一个匹配。
r1 = /\d+/;
r1.exec('123-456'); // ['123']
r1.lastIndex // 0 每次都从第0个字符开始搜索
r2 = /\d+/g;
r2.exec('123-456'); // ['123']
r2.lastIndex // 3 从第3个字符开始搜索
r2.exec('123-456'); // ['456']
r2.lastIndex // 7 从第7个字符开始搜索
r2.exec('123-456'); // null
r2.lastIndex // 0 从第0个字符开始搜索
注:
(1)regexp.exec会返回一个数组,
第一个元素是匹配到的字符串,后面元素是各捕获组捕获到的字符串。
(2)可以手动设置regexp.lastIndex,
让正则表达式从某个位置开始进行匹配。
3.2 i
忽略大小写
/[a-z]+/.exec('abcEDF'); // ['abc']
/[a-z]+/i.exec('abcEDF'); // ['abcDEF']
3.3 m
多行模式,
在多行模式下,^
和$
将匹配每行的开头和结尾,而不是整个字符串的开始和结束。
每行通过\n
或\r
分隔。
/^\d+$/.test('abc\n123'); // false
/^\d+$/m.test('abc\n123'); // true
3.4 s
s
标志是TC 39的一个Stage 4提案,已准备纳入到ES 2018规范中了(finished-proposals)。
在之前版本的JavaScript中,.
是不能匹配line terminators的,
/./.test('\n'); // false
// 替代方案
/[\s\S]/.test('\n'); // true
/[^]/.test('\n'); // true
增加s
标志的动机,就是修复这个问题,
让.
可以匹配所有字符,包括line terminators。
/./s.test('\n'); // true
3.5 u
unicode模式,
这是ES 2016引入的flags
,
让我们可以在正则表达式中使用unicode code point escapes。
/\u{21}/u.test('!'); // true
/\u{21}/.test('uuuuuuuuuuuuuuuuuuuuu'); // true
注:
(1)不使用u
标志,/\u{21}/
也是合法的,将被解释为/u{21}/
,
它可用于匹配21
个u
字符。
(2)不使用u
标志,.
可以匹配所有除line terminators之外的,所有BMP字符(Basic Multilingual Plane),
使用了u
标志,则.
可以匹配除line terminators之外的,所有的astral字符(astral planes)。
/a.b/.test('a𝌆b'); // false
/a.b/u.test('a𝌆b'); // true
3.6 y
sticky模式,
仅根据regexp.lastIndex的值进行匹配,
成功后更新regexp.lastIndex
的值,失败后将regexp.lastIndex
的值置为0
。
r1 = /\d+/;
r1.exec('123-456'); // ['123']
r1.lastIndex // 0
r2 = /\d+/y;
r2.exec('123-456'); // ['123']
r2.lastIndex // 3 更新lastIndex的值
// r2.lastIndex === 3时,无法匹配
r2.exec('123-456'); // null
r2.lastIndex // 0 匹配失败
// 设置r2.lastIndex = 4,则可以匹配
r2.lastIndex = 4;
r2.exec('123-456'); // ['456']
r2.lastIndex // 7 更新lastIndex的值
参考
MDN: RegExp
tc39 proposal: proposal-regexp-dotall-flag
Unicode-aware regular expressions in ECMAScript 6
New regular expression features in ECMAScript 6
网友评论