JavaScript

[ES] Regexp flags: gimsuy

2018-01-02  本文已影响15人  何幻

1. 背景

正则表达式是用于匹配字符串中字符组合的模式。
它使用一个模式字符串,来描述一系列匹配该句法规则的字符串集合。

在JavaScript中,正则表达式也是对象。
这些模式被用于RegExpexectest方法,
以及Stringmatchreplacesearchsplit方法。

正则表达式对象,有一个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}/
它可用于匹配21u字符。

(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

上一篇 下一篇

猜你喜欢

热点阅读