[ES] Regexp flags: gimsuy

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

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 220,137评论 6 511
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,824评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 166,465评论 0 357
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,131评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,140评论 6 397
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,895评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,535评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,435评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,952评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,081评论 3 340
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,210评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,896评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,552评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,089评论 0 23
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,198评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,531评论 3 375
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,209评论 2 357

推荐阅读更多精彩内容

  • 第5章 引用类型(返回首页) 本章内容 使用对象 创建并操作数组 理解基本的JavaScript类型 使用基本类型...
    大学一百阅读 3,238评论 0 4
  • 官方中文版原文链接 感谢社区中各位的大力支持,译者再次奉上一点点福利:阿里云产品券,享受所有官网优惠,并抽取幸运大...
    HetfieldJoe阅读 2,895评论 0 16
  • 转自: JS正则表达式一条龙讲解,从原理和语法到JS正则、ES6正则扩展,最后再到正则实践思路 温馨提示:文章很长...
    前端渣渣阅读 1,815评论 1 32
  • re模块手册 本模块提供了和Perl里的正则表达式类似的功能,不关是正则表达式本身还是被搜索的字符串,都可以...
    喜欢吃栗子阅读 4,010评论 0 13
  • 这个时节的校园最让人期待,梅花谢幕,像优雅的夫人,玉兰登台,像棱角分明气质凸显的女子,桃花李花含苞开出星星点点,像...
    独自沉思阅读 230评论 0 0